From c222da649ec7488c5c7cdf51c117ced0a1f1c342 Mon Sep 17 00:00:00 2001 From: Malte Heinzelmann Date: Fri, 14 Jun 2024 22:18:34 +0200 Subject: [PATCH] NFC and factory testing --- components/keyboard | 2 +- components/spi-st25r3911b/CMakeLists.txt | 6 +- components/spi-st25r3911b/NDEF/.gitattributes | 6 + components/spi-st25r3911b/NDEF/LICENCE | 54 + components/spi-st25r3911b/NDEF/doc/ndef.chm | Bin 0 -> 1120244 bytes .../NDEF/include/message/ndef_buffer.h | 89 ++ .../NDEF/include/message/ndef_message.h | 211 +++ .../NDEF/include/message/ndef_record.h | 409 ++++++ .../NDEF/include/message/ndef_type_aar.h | 143 ++ .../include/message/ndef_type_bluetooth.h | 425 ++++++ .../include/message/ndef_type_deviceinfo.h | 165 +++ .../NDEF/include/message/ndef_type_empty.h | 118 ++ .../NDEF/include/message/ndef_type_flat.h | 132 ++ .../NDEF/include/message/ndef_type_media.h | 142 ++ .../NDEF/include/message/ndef_type_text.h | 157 ++ .../NDEF/include/message/ndef_type_tnep.h | 323 +++++ .../NDEF/include/message/ndef_type_uri.h | 184 +++ .../NDEF/include/message/ndef_type_vcard.h | 216 +++ .../NDEF/include/message/ndef_type_wifi.h | 155 ++ .../NDEF/include/message/ndef_type_wlc.h | 392 +++++ .../NDEF/include/message/ndef_type_wpcwlc.h | 163 +++ .../NDEF/include/message/ndef_types.h | 259 ++++ .../spi-st25r3911b/NDEF/include/ndef_config.h | 168 +++ .../NDEF/include/poller/ndef_poller.h | 671 +++++++++ .../NDEF/include/poller/ndef_t2t.h | 351 +++++ .../NDEF/include/poller/ndef_t3t.h | 351 +++++ .../NDEF/include/poller/ndef_t4t.h | 501 +++++++ .../NDEF/include/poller/ndef_t5t.h | 482 ++++++ .../NDEF/include/poller/ndef_t5t_hal.h | 209 +++ .../NDEF/source/message/ndef_message.c | 317 ++++ .../NDEF/source/message/ndef_record.c | 623 ++++++++ .../NDEF/source/message/ndef_type_aar.c | 171 +++ .../NDEF/source/message/ndef_type_bluetooth.c | 808 +++++++++++ .../source/message/ndef_type_deviceinfo.c | 416 ++++++ .../NDEF/source/message/ndef_type_empty.c | 168 +++ .../NDEF/source/message/ndef_type_flat.c | 195 +++ .../NDEF/source/message/ndef_type_media.c | 178 +++ .../NDEF/source/message/ndef_type_text.c | 317 ++++ .../NDEF/source/message/ndef_type_tnep.c | 711 +++++++++ .../NDEF/source/message/ndef_type_uri.c | 400 +++++ .../NDEF/source/message/ndef_type_vcard.c | 723 +++++++++ .../NDEF/source/message/ndef_type_wifi.c | 513 +++++++ .../NDEF/source/message/ndef_type_wlc.c | 1205 +++++++++++++++ .../NDEF/source/message/ndef_type_wpcwlc.c | 224 +++ .../NDEF/source/message/ndef_types.c | 239 +++ .../NDEF/source/poller/ndef_poller.c | 513 +++++++ .../NDEF/source/poller/ndef_poller_message.c | 240 +++ .../NDEF/source/poller/ndef_poller_rf.c | 121 ++ .../NDEF/source/poller/ndef_t2t.c | 1290 +++++++++++++++++ .../NDEF/source/poller/ndef_t3t.c | 973 +++++++++++++ .../NDEF/source/poller/ndef_t4t.c | 964 ++++++++++++ .../NDEF/source/poller/ndef_t5t.c | 927 ++++++++++++ .../NDEF/source/poller/ndef_t5t_rf.c | 871 +++++++++++ .../en.STSW-ST25RFAL001/include/rfal_nfc.h | 50 + .../en.STSW-ST25RFAL001/rfal_platform.h | 35 +- .../en.STSW-ST25RFAL001/source/rfal_nfc.c | 52 +- .../spi-st25r3911b/include/st25r3911b.h | 10 +- components/spi-st25r3911b/st25r3911b.c | 333 ++--- components/troopers24-bsp | 2 +- main/audio.c | 2 +- main/factory_test.c | 101 +- main/include/factory_test.h | 3 +- main/include/wifi_defaults.h | 4 +- main/main.c | 48 +- sdkconfig | 11 +- 65 files changed, 19960 insertions(+), 282 deletions(-) create mode 100644 components/spi-st25r3911b/NDEF/.gitattributes create mode 100644 components/spi-st25r3911b/NDEF/LICENCE create mode 100644 components/spi-st25r3911b/NDEF/doc/ndef.chm create mode 100644 components/spi-st25r3911b/NDEF/include/message/ndef_buffer.h create mode 100644 components/spi-st25r3911b/NDEF/include/message/ndef_message.h create mode 100644 components/spi-st25r3911b/NDEF/include/message/ndef_record.h create mode 100644 components/spi-st25r3911b/NDEF/include/message/ndef_type_aar.h create mode 100644 components/spi-st25r3911b/NDEF/include/message/ndef_type_bluetooth.h create mode 100644 components/spi-st25r3911b/NDEF/include/message/ndef_type_deviceinfo.h create mode 100644 components/spi-st25r3911b/NDEF/include/message/ndef_type_empty.h create mode 100644 components/spi-st25r3911b/NDEF/include/message/ndef_type_flat.h create mode 100644 components/spi-st25r3911b/NDEF/include/message/ndef_type_media.h create mode 100644 components/spi-st25r3911b/NDEF/include/message/ndef_type_text.h create mode 100644 components/spi-st25r3911b/NDEF/include/message/ndef_type_tnep.h create mode 100644 components/spi-st25r3911b/NDEF/include/message/ndef_type_uri.h create mode 100644 components/spi-st25r3911b/NDEF/include/message/ndef_type_vcard.h create mode 100644 components/spi-st25r3911b/NDEF/include/message/ndef_type_wifi.h create mode 100644 components/spi-st25r3911b/NDEF/include/message/ndef_type_wlc.h create mode 100644 components/spi-st25r3911b/NDEF/include/message/ndef_type_wpcwlc.h create mode 100644 components/spi-st25r3911b/NDEF/include/message/ndef_types.h create mode 100644 components/spi-st25r3911b/NDEF/include/ndef_config.h create mode 100644 components/spi-st25r3911b/NDEF/include/poller/ndef_poller.h create mode 100644 components/spi-st25r3911b/NDEF/include/poller/ndef_t2t.h create mode 100644 components/spi-st25r3911b/NDEF/include/poller/ndef_t3t.h create mode 100644 components/spi-st25r3911b/NDEF/include/poller/ndef_t4t.h create mode 100644 components/spi-st25r3911b/NDEF/include/poller/ndef_t5t.h create mode 100644 components/spi-st25r3911b/NDEF/include/poller/ndef_t5t_hal.h create mode 100644 components/spi-st25r3911b/NDEF/source/message/ndef_message.c create mode 100644 components/spi-st25r3911b/NDEF/source/message/ndef_record.c create mode 100644 components/spi-st25r3911b/NDEF/source/message/ndef_type_aar.c create mode 100644 components/spi-st25r3911b/NDEF/source/message/ndef_type_bluetooth.c create mode 100644 components/spi-st25r3911b/NDEF/source/message/ndef_type_deviceinfo.c create mode 100644 components/spi-st25r3911b/NDEF/source/message/ndef_type_empty.c create mode 100644 components/spi-st25r3911b/NDEF/source/message/ndef_type_flat.c create mode 100644 components/spi-st25r3911b/NDEF/source/message/ndef_type_media.c create mode 100644 components/spi-st25r3911b/NDEF/source/message/ndef_type_text.c create mode 100644 components/spi-st25r3911b/NDEF/source/message/ndef_type_tnep.c create mode 100644 components/spi-st25r3911b/NDEF/source/message/ndef_type_uri.c create mode 100644 components/spi-st25r3911b/NDEF/source/message/ndef_type_vcard.c create mode 100644 components/spi-st25r3911b/NDEF/source/message/ndef_type_wifi.c create mode 100644 components/spi-st25r3911b/NDEF/source/message/ndef_type_wlc.c create mode 100644 components/spi-st25r3911b/NDEF/source/message/ndef_type_wpcwlc.c create mode 100644 components/spi-st25r3911b/NDEF/source/message/ndef_types.c create mode 100644 components/spi-st25r3911b/NDEF/source/poller/ndef_poller.c create mode 100644 components/spi-st25r3911b/NDEF/source/poller/ndef_poller_message.c create mode 100644 components/spi-st25r3911b/NDEF/source/poller/ndef_poller_rf.c create mode 100644 components/spi-st25r3911b/NDEF/source/poller/ndef_t2t.c create mode 100644 components/spi-st25r3911b/NDEF/source/poller/ndef_t3t.c create mode 100644 components/spi-st25r3911b/NDEF/source/poller/ndef_t4t.c create mode 100644 components/spi-st25r3911b/NDEF/source/poller/ndef_t5t.c create mode 100644 components/spi-st25r3911b/NDEF/source/poller/ndef_t5t_rf.c diff --git a/components/keyboard b/components/keyboard index 76cf073..8a3ae33 160000 --- a/components/keyboard +++ b/components/keyboard @@ -1 +1 @@ -Subproject commit 76cf073ad933a19c8e2c88d69a073e7555653a67 +Subproject commit 8a3ae33cc14326433202a22544119cb0977943cd diff --git a/components/spi-st25r3911b/CMakeLists.txt b/components/spi-st25r3911b/CMakeLists.txt index c7c9b03..af55a97 100644 --- a/components/spi-st25r3911b/CMakeLists.txt +++ b/components/spi-st25r3911b/CMakeLists.txt @@ -24,9 +24,13 @@ idf_component_register( "en.STSW-ST25RFAL001/source/st25r3911/st25r3911.c" "en.STSW-ST25RFAL001/source/st25r3911/st25r3911_com.c" "en.STSW-ST25RFAL001/source/st25r3911/st25r3911_interrupt.c" + "NDEF/source" INCLUDE_DIRS "include" + "en.STSW-ST25RFAL001" "en.STSW-ST25RFAL001/include" "en.STSW-ST25RFAL001/source/st25r3911" - "en.STSW-ST25RFAL001" + "NDEF/include" + "NDEF/include/message" + "NDEF/include/poller" ) diff --git a/components/spi-st25r3911b/NDEF/.gitattributes b/components/spi-st25r3911b/NDEF/.gitattributes new file mode 100644 index 0000000..88961fc --- /dev/null +++ b/components/spi-st25r3911b/NDEF/.gitattributes @@ -0,0 +1,6 @@ +# Set the default behavior, in case people don't have core.autocrlf set. +* text=auto + +# Declare files that will always have LF line endings on checkout. +*.uvprojx text eol=lf +*.uvoptx text eol=lf diff --git a/components/spi-st25r3911b/NDEF/LICENCE b/components/spi-st25r3911b/NDEF/LICENCE new file mode 100644 index 0000000..d5b35a4 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/LICENCE @@ -0,0 +1,54 @@ +SLA0051 +SOFTWARE LICENSE AGREEMENT (“Agreement”) +BY CLICKING ON THE "I ACCEPT" BUTTON OR BY UNZIPPING, INSTALLING, COPYING, DOWNLOADING, ACCESSING +OR OTHERWISE USING THIS SOFTWARE (HEREINAFTER “SOFTWARE” MEANS THE RELATED SOFTWARE, +DOCUMENTATION, OTHER MATERIALS, AND ANY PARTS, PERMITTED MODIFICATIONS, AND PERMITTED +DERIVATIVES THEREOF) FROM STMICROELECTRONICS INTERNATIONAL N.V, SWISS BRANCH AND/OR ITS +AFFILIATED COMPANIES (“STMICROELECTRONICS”), THE RECIPIENT, ON BEHALF OF HIMSELF OR HERSELF, OR ON +BEHALF OF ANY ENTITY BY WHICH SUCH RECIPIENT IS EMPLOYED AND/OR ENGAGED (“YOU”) AGREES TO BE +BOUND BY THIS AGREEMENT. +You represent that you have the authority to enter into this Agreement. You will comply with all laws, including export laws. +STMicroelectronics’s failure or delay to enforce this Agreement does not waive STMicroelectronics’s rights. Swiss law, except +conflict of laws, governs this Agreement, and the parties consent to exclusive jurisdiction of courts in Switzerland for litigation of +this Agreement. +Subject to the below disclaimer, the redistribution, reproduction and use in source and binary forms of the software or any part +thereof, with or without modification, are permitted provided that the following conditions are met: +1. Redistribution of source code (modified or not) must retain any copyright notice, this list of conditions and the following +disclaimer. +2. Redistributions in binary form, except as embedded into a microcontroller or microprocessor device or a software update +for such device, must reproduce any copyright notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +3. Neither the name of STMicroelectronics nor the names of other contributors to this software may be used to endorse or +promote products using or derived from this software or part thereof without specific written permission. +4. This software or any part thereof, including modifications and/or derivative works of this software, must be used and +execute solely and exclusively in combination with an integrated circuit that is manufactured by or for STMicroelectronics +and is an NFC tag, NFC dynamic tag, NFC reader, or UHF reader. +5. No use, reproduction or redistribution of this software may be done in any manner that would subject this software to any +Open Source Terms. “Open Source Terms” shall mean any open source license which requires as part of distribution of +software that the source code of such software is distributed therewith or otherwise made available, or open source license +that substantially complies with the Open Source definition specified at www.opensource.org and any other comparable +open source license such as for example GNU General Public License (GPL), Eclipse Public License (EPL), Apache +Software License, BSD license and MIT license. +6. STMicroelectronics has no obligation to provide any maintenance, support or updates for the software. +7. The software is and will remain the exclusive property of STMicroelectronics and its licensors. The recipient will not take +any action that jeopardizes STMicroelectronics and its licensors' proprietary rights or acquire any rights in the software, +except the limited rights specified hereunder. +8. Redistribution and use of this software partially or any part thereof other than as permitted under this license is void and +will automatically terminate your rights under this license. +DISCLAIMER +THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS, +IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY +INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT +SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. + +EXCEPT AS EXPRESSLY PERMITTED HEREUNDER, NO LICENSE OR OTHER RIGHTS, WHETHER EXPRESS OR +IMPLIED, ARE GRANTED UNDER ANY PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF +STMICROELECTRONICS OR ANY THIRD PARTY. + + diff --git a/components/spi-st25r3911b/NDEF/doc/ndef.chm b/components/spi-st25r3911b/NDEF/doc/ndef.chm new file mode 100644 index 0000000000000000000000000000000000000000..e5c791a6d7fd0a4f481322fbd99420361a61e3ab GIT binary patch literal 1120244 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 z

~a1K}Q|_JRZM!5HHz)>v#1?*Bkzef0 zv`;FoVb23=z(&UsL%dwffot%ss(h-OPyZc?T7p!}o;1x~(@rq24!epVzalY_ZfqhB zYY7I`E8Ns&y|JY%g7#inC%#~r`9^7iIWa;97MLe{PrJ_-J-#A}IE~mMrML1)JL|h= zt1XJV!w0NZ&7?rw^3Kv8QUiUu59UGNQt1hL-cj zn6g!p0W^;_2{v;_8kGBRFQ!0GQj&5*hoRUhDy~SQS=t|F=-b(y`x!6gQy0`b_(V

az-e1Vkl4A3rxz61v^wrz?w-^vea zp)~Geesn+}#16d6B`TDz{pu(0*-|U%)IC7Kf$SWO<5Ok@3)oKDoi5#!vM=2W9SJKGA%F;c%~^` zL8y0kU!*z0=kw?_JUgTIumhWMd!=uPGonnqs9Mi+ z9WCH~Ed%aGtlfNqcz`QFrs|+xcGp%IQ3KJNp;3GkjYb8Ps2W|W`$k>4}#bV-3Kq$8E`THKgolP{!)B!>YOs%s!gy0C>^b}_L@q{-Bn zr$kzdTk5MBsBMTxp~&;Fe3)y*q%orRw!dl5XNdG4lKGqI(?=+z+Rmt}2LzX##hUXV zs9&w|ZdPzITwUfi#eHRKlsPkNSjD$oA&i4hXTEnX`&Nhz+q!H>mS8(jyD{+cJ&W(6 zXdf`Xdw}9fZS$>NRhza>-^vaZGqG(=`c^TzL;>FlK$s`6YzoNiDZG%MW!<+uv1#H$ z$b+GWzQtPx^JPPCX}^(0Qc}RxEExtHy`hRn=)jELnH!6-iCgi(@dA5&)PF= zWaZR%)c`VgLta)FqLD}d?c&~*v|C5u*@r#KmYYL+us7irmmy8?)<7J0`VjY(Ax$VM z2P+zvkSWn@os7>j-GjUrT(W}7bFIRQYB?^VPUZJo0WX77IfT!(fcyIt7gHl~ElMww zjf6Uw<8m6{RvqyX`%!yEjXb&@YY^CIJ+Jenqe4}z1>!%^==E#ZT#6<0FZgVa}Ec@c4X;kO)55dYo9Ygl8$+4UYb3hkXhnhY0h$gp; z#pmc698%u^7(ZuKD)AOcyiNsVZ}=gi9geTOVQyihE=dKa&$u26SDs46@ki3c;p>~? zAQ^W&+{sYVogwkrRcd{%D-8LyfN#>?#Vy|zuo}F4#9FK>yCnP@J<-G&niMCuFlK|} zuO%!Z8Ljh(orLg&aB5`mxVB~=Hhc`CCuu%@sR;yM_GkGi3VW7`y-C=qPX=bu;x!?J zSSHZYzUz|+%~>TD(wU8A{(QmRh3K4+Cbz|14YMa;3*aW^c&qL(^DP)2VS}pKwZ5yp z{ythe55^K|N$_%b4cFCP@vS6_GRp$_Kn$*?28#4NW{QmDIc zkkKzpc=VLs!yn|k1+ur?z2x4udkD9A$flUZmd6e@M!id6_R+P#b@r~KRV9Yc{4O^S zFFx?|ReFq=m)32I!e*f=%fMc%qBqT_ZJp>1k!t$QPR2&Wo;VrEvh_kbD|aSe_nl>C z9PY2PbHEY8nhJEee_i0vW3x7xQN_i{mFs+{*o(BGhT-~Ylht!A9E6OO-pcxrTNh#S zmKGil10ETDtj{~qkeSaD7r8?nJ*Y`Z%9SN&!AN6oc6>3f_RXrp1ZHfQ18UQ*e3y9G zoxYUI$syj_)cgyzqIbf-~jj&`9Q38& znCe?ey*^EcrdSoB;o@2>Ls!4Xv_nm?P)H`(Jen6#w8-bnFK5{7>{g<>+H8kqI>H^V zeY<%hUmKZnheZ;03rs%5L)@2Tx7Ko%5bS*()6K_523&&wR9KOUFr*Zji!8n~z$K={ zb;m_fchpQIYbeV)(8+_f`^D~(53t3S?-cO_gdPU>fswI3YDF1gLckgUJA_SxOiPPV0Lmc82)r(88sT@BB&*$PPY)Q9h$h*`L(#hTCmdiLytDb zs)%K`V8BG(Ob42_d*kyG#_$|n=_&+0{f(1u?oA)>Ayg+)!& z76O;vE|5yj)vR93_JS~xg#S5!QBBKUh6P;by}`vz0=(baSaRf8>{4TfW!srPaOTEG z6T-YVUO&LUt85_^K3~fgaSBYR?)MqP1|uywI@}6N71c-TtTa>0>%`Vqke-+~K~mia zzCTsVEVJbQE_wF&1m3}wXhHRYTdw{O_Kt>V(umIRt0LnMX0dQVH7K6tvme1=rI=VRp+Vn22j%g0H(=MZ@c52R9Rj-Dhtq&Y+@YbHy z;y3Sod-kF*_d|Zb*|*Lf^46BK({kgEw2P*b+KY3_k=d&AodM&x+gal_-X`x~oxB*F ztl7K7suEIDq?H7c<*?94*rg|+FFp$7N&QS{H(;>`;J z!eKwn^~!H!VQ6sZPR-@V7pc3`?7lBbY`&;m6dt#Ge&Wbn7HF+G7|A~w#lr|J=V!rA zx9YBsmx-E^s6gP4Bn{*BdY=Vjicf<>56mC~hLq`O#6rG|OL;e*JRnFA%aeriIO8L4 z#On_1PT^b^MI{!G)gI#&cBP@wCwGBz;3Ba{!<#+rvbAN8%BreyI_C(i@3~u`_?`_g z?!aK@5#0xE#OeqmzwVQO38Q8U2+YXMdO0*uX^r8u2lrf3Dm1h@(7hxD?U50}D>SD0 z81nyLO_UqtBqDTtWHnez8!+3!X|Cl*uCcXgj;v9fQ!gYW+G3$kpfIe zqKu7sD}@LdW)C5)cOY_COd+`HkjzYK6HYhAto%_Jb;he8F7)20`IV&7fcild^Ew0( zfa2%qE{!sn#Z2NDVi_NjybaQDgep;-T{zX8QhIaxdzMDXc!0*5m=A3Bj~ZmrM?E=C zJ`AH7l<{o8)ecIbk?D(Z46;kUn>)=N{AJ`BsJ@6_5k|Kt)%K9!k@XUG64-5K8c9)4 z8rLp6Y}fyZs^i9{gEThYLG}ENL`3}_8NNp28P3Kkf+U^RE860M%~+H{J$>a%5s z)G$iK!KqZ`oBIb1>(B2dkXu>A`F(vc*%aFl0f$xsgo7pIwl$XCMN8blSefFwUpa{( zTCMg*!S}c^I@CP=>+^1$zRlE6uy~}?N=%Oa0oE({a7nBmGq4OopUKqg2D2gYrhq~K zu+E|}J@#fNMf|rn4eBasm4hg<4UxzDTPR12kDng!9`ZH08BdYfKiz#UN6$O@ zeslQ1vis65)t4my!opbXy>Ir#Oq%$VNFgy=d;}uEqLBbEv~m43>uH2mvhwA4OrtOpE4f|@<3W4PN2&`BH)ajAT8oKI9SMasBd<=EDNo-4!__B6E*P_ zxzm)2H|1)6;z5dYfkQ>y^Vv`?-P#^oxA?{nM6<+Vpoy+FB@c#k_-Ln|&_)}zA2dMX zd{R9DJ7d5beYxdS)EYbVjkm~Z2Cw`MlPw&u6)^P#VPhUujKP;xMz z-RAagF^{QYA6K1;!IG{zi+fzX^i?Gv5wC#A0UbN?LzyKk7dfIW7=XuvbiP_Y2`@x9@|F9?2k36tJZ>6B*cH?LGd?ZjHO+mX%IjK(a#c zP#Q5vi%wp<23A)giw1WhS z%e5jtyPgGQ*g+ z6GK7$p!f6+>Oz%F^7QU=1W{&`vBVYTmOjGfqK0#1k|8#B{)U+AAR?pqg3<@D<30ue z_Rd1sFEPGXjquIMT@_Na`Ea3VJ;Iq!iQcen$NPV-TrI>7qj$LSb_xdPS;6qrF{p{I z(#o34PQDH$bAQK-_G)RRH`Ee@&#x==eg|k=2_*jT6}O`Gu`k3 zvWO2&ByNk$H0xb&K(ac z4cLPw(e|{+QmOtpRgVWD06%bSETVtQvs8cE*TtM!uQ>=2Mz4l^%_3nlVFi1&9McQY zO7mY3%+*m?+i?~Q2UPj0)ABbeXoV@g^P403%9}&`D)cbBaCi=;&i9jGx_Dl|3qzk* z?i-HBo-DGTU}K5m=^$UW2eo%4DBHu{$-Thci`(gh8{#q1_ob)(oa_7A@v~WB9+grO zrfKEjtBdvt+B&;v`kG^SWv|L-5`%gq80E52v?PPH{mKMbOobj6v{Q~t6RoUQZ|*Yy z@)KsvaM7;fFIco}#G}_&xdp2~)3)i8@zyAMF5y_`V4uy7X=_pEkPCfPHHQbz(dr%$ z0Kej~DGB7?$LQ>lg)nLv+%z3eSgC2qFaTgjiBY~ z-h64LmY|O81hFSM+{J}&ljlsqImu*B8y@=ICvm(EG7 zKE`P87-NUK6qBIbg`XtwNKZZy_9t%!5(~P8TbUrM&MtJ)hU$lr_`A-q=y+&d5~ySy|`q=zkSBo3aXo#w=&{lLJnQpIeu^D1b+%DAU|gCH?$Nh zJKY(h^x2_UEFl<$YlxAh^o*Gkk2|hfiX$ohw{t*2xNlN4$Ew(S&AcBbl-1vAAEMOg zvQrAV64;F(_(w^KQ3MG3;Srz@D`?o?>Q^hUE6(?i083S0WEwwM=s&_(gr81q!1MK> z>OSClqGluR-6`X=zo(pzBHL8G)ao#DCSq#X)~A!gyDt4EOylZGwd=9(tpUlR^`|TX zZrNzQ<((9X?nN05RHI+|-al3rMj~QlqA27;ixQaKc=+COf2ZQPNajlnMJ{ilk^ZM| zls{PHvedvy<|AOFa(ce)rXV#vkfq?^xjgo=6#S&iuH^bW4lX`t$#D2#_`>Li>Qnpk zs1hByPrAp?8B@$Gc8%Q7CL0XOwf`RgLqNR0(FX*DyA>ULc4{lAwnvps*h&~;YI=Ec zpQx!rf2JNK?3>6Pcxk@wt_*N=X1Ufa`qhRuNr{efo*QO0eV$InR+`PdOC>;#6;g5Y z52?ZqV{~Ke4~D08o$%>A4tq4Y-?Sm5cIhIpFXqNn2lk=3L#$)r3EUm)ION@fcw$6S z4PA(ka}_NnnVh_`d$r>ig1b49^?7^p%;D5<)kC!Q$mfSVf}% zj_=Akf=J{a?_(iX9ef0>SoV=g^VXxx%+bw6=7s$2&Au=04VE+wj;iOKGw}`;Rfl4_re$l>iKKIRp=#d$f2g=P1d+;^Wa;CF^-3F;0w4N*^RKc+=I zCHU{RW3K^hiP00F3oe~Foad;^41II`^1-p zC7t@iWeAKd%7cbgMYbllkPL`#6(78H>iDxid^>cWefATKsr_%#xrX~LNp-*3X$~Ql z{+>F+(f0G|(CvMIN$SpR{ii-ZPdDtT^%cDt#Mz$T{{cw3_wl>*IyrZ(_2b-M(q-Ov zIlz{gSt_-iL*<`A{)@)y0l3M%x91GDVP_Px9dQ0b6XT;ZMqtbNKm7rl9dodWCcS*+ zA++J1XMwi>APr3PvOt+`PmAh6+2L=~pQOwDKRm+Fzk!6!?dwkIM+6_i;JWChM!t1< zK?4m14lj;^El@rp4hD7k^Z+j^?c<8TMhK!=(5E67yR43lb1wy6Dt0SBeKupct_S0t zePB0#WLZFjDWagfkbr`H_KlVKHuZb_`o_+BD~cc2i}YgNxPgychnL~kzQ>^OM<3XD z%!iVrTPSTrJyr|q^lbehvLS+=)S;)={8_Ck(=mAIg<5kbFK^4CW;gfWOx8U6XdAq3 zkg$vAbM#*WdVTXL_1hGz+2%gQ=-Vt^<1u^+{TZL_geY!r8$Yg{Q{F~J&2H|f*q+^w z`s_%~HQ_Y+sCs{gBhW5dj$xKzkuM=zM&gfgD`tBA2UsiHdXP#H@yn zeRRtF6)t^z+@D4&D7)p!v4z8up0>uqOBsI`9HB!O4}DT>x;ei&t>pqh`CI}uwsD76 z9e1-&G}A&8#?gq-|dqidi ztMlC3DX$ytyy-0eJ=F~x*8J`JLQTJEv}~evG_UE^?(g0hb;!nL9^3W*beo~*&NOyF zK2djXe(&X5o#z(({#xvJ+ttauD$ew3|7hAw-rfp$->l!;HyGqf%qOZx1^f@|IgyP7 z6sLGTda3tKL&k2!egBUJd$-%FFg-lEm_kcJZ@!CX6YV zDt9)2(X9oKJ#QSNX;?DKCsj7;3vbL@)_9tzI z*vGJ@$P>A_Ww)IdfO2BlRah}NG6 zL>}gBWbUx)&P}D+KaYdK7Vo0oKL!g~93rVpuS47$N_Q(nzoyr$Y$(5t%m#M+`Te3n zY&0BKZG|<9*rb86ok}w?R`boqh!}zva^PUJ{fV;@^dmU}g(0beShh+nRvys|zWqT1 zGLpb_m_{y+HIA@ZV{$r2-xV~f_Ff>51dQarc14Q*QpmZ%iV3nktAq&VDkQnF90j~P zaerG@9jAFo-kvgBLr7bg^>AqK9R`LL*Tuv(|E_8Cn_8NjRSsMjRGQ)JjB*Ni_&d!J zfMSc8UiQqYyHdLQ5gC#g{yf4Ff!_0Ewueh{;F2LXZGr8>b5&A<~QY_3-L z2KQnK_)1K*IJem)2*z2)I18?5kvw7RD zl&cpKCM+Vdpek@|oK95HDWQ(VTAN(u_9#s&-P3QB04>kGNGTzLvWq)lSYcQgs+hA@ z!9e?abZRkT^?m!?p6*f7(!43s5vnWL3_~KCLHY!t7p3`U6v&I4`sUm&?fsat97lGw zC}NM<88!xEbA;*CcZt7Kn7>4c^`r4}5P(t7YCjcDC%Wo5R@3=#otRh*tc{Bgv~u+Q z<>SyuHwK0fKS@bihs_>6gXuNF2$+|CakoW^IxR%3?D z!p9h>9y+dM|GprSn)IFrM{^BZ4s6GJ2C&~!!m(r19i`bq)fsJA;L zGZ3j27gD4JzJ_^?r|2)jQU2;v>Clmw5~~}uR8#X5(MZ`qF0nO#p^*?9Ut2oFX?JQ9 z-hvSbgY)DN8dW&fO^Uj0xV^rC`975UH10~PX!*PKmzaP1EDgz+g7wNf(!(NgI@hU! zs5w1O6*^B|9jsw!-hKYvbT&Bkx~sIlCXmfnKv)~=@Ty=<@c>l4;l-yk2gmv@T(uZ# z2Ny&k5KNv(ss&qbozpr`fwckFv+C}WG&2kWCH9Hoyc~p*srpAv_I0n&aBE%0pT?6i zyZtUxBdN11;L1s=5W>ntpY*R;f>AjHW;IA4CTf~~n>qN$9K~m|c6&7@Em6}q7cLZ5 z1FuI5PyAD44+wCbN4JjZc<@HovX~QUlwpE&WK5CQHdDnauB)qMOx0KJ22c3c#s>X! zZF`EC_&E%Tk2#7Ou#jtY2d?bKEE478&$x3RnJQ`B#B~UZ>uaWK&=^D(w)RSq)KI>p z^siSJnMNAL(X&8|@t(=t z82fnU0^3Udbp~RE^8}Pi$dr{T(EX1%TIf*&Glwp#vpuhe}p%ZYnW&N+& z3Lc)3`54O_|4p|p7F~PFdf}|L=9Mai(>eK?g>U?#UcK0$upOYVfL|~pGN2n%AYy2r zlO@#qrG)@j&#AHc+6fR)%{EBs1Xs6r-I%6*!Q}#fWC)Z0^B8!1V`gxbeK}R59oeZC ziH=Ts+8faECkh)D1NNXArd-9pV#1E7@kSl>TMh(BHe|nAaCwfQg|Yq*fnT6p;|Chj z=w7z2)NbA5&$n~_+Wlu*4wIh$rCKbdzW6L0LE_y@Z3^8xDMia+3L>7)$zxTw?Z^LZ zCWnX6GfEO}4-n0bG8vXjL4Mw+&NrCyB~yZXr?4;~ zjvZI{33eTXmGvp80@-+*x3thfE=b7w2sH%x7{L6aG0z;a_Qgk=es1DX-p1pZFe?i4 zN3x2ajE*DmPr7Suj?4?&ZF}lhJ%3Clhl!@h7OpJEv8PU9T!pj$I3U4qtK9cp0x*?JQ)8 zcTJh>iHk^uC(!O4`LY1gSror`FMM!i3Vr~Jx0&I5P)1C^m=H$33Rcy%V4bpK9B*C7OaIqX4dHwV(0ZWQdA^Pu z>|(&7;fj1}p1!ji=dCc#$l`aChLNC2=(v##oThFAOPDI3i^@Ppqn9vpL&G~vJEZ}i z3%HVU(<*EmCFa@?bx{^V%9L3WwIBbsS^8vSJj%Srx97FP zMQFy7UxhprW#V$J?P;hdpRhAov{o+u5b-o;JoLZD(hc(zSBJH*dF)n!O~8!+C*Saz z8csYa#2pHN@u1{<1iYtXFZx4c@@OgorK9@zS<5yBo@K zn>8=^8sgeysb6=-9b&8*ClR{EMJ2NuE-vkrJG@(?O?Pf2)MI_HuGX${*kMs8SEv52 z&?7I~_2V~NW4BAKf}U9mGp^(UB7C?tmIeUxspC{AJ>%kkY}d#b&aRtpWW73A0Th`` zF*}}vUx+PFF0XY<&uV0LtR)3Ur1RH%{r0;{am;UY`8$Mb~G>5?xqH z;p$UXcI_*DW0tFdx9Dqkk35Ul4lZJ*40-m${{7^sYFJNfD-4GYYl9$0es(b5>&~Ou zGPdyqU&!+NBV3})(Yrf`(~N%&)&Uzkl_KHknkSmP!lnszgQBwP?2A_X!X^2i!DC^N z$kh*AAIB=Dzamc=xpYdo*j1I*4F&e0*loBbFiav*Zs|YAFWK!6yrl;DMKP7u4Gg{> z`!?_6#9k(1cBT@7TIE-1+H%(mYj4->!yJ}-9fTxauw&O8Aj!iV3V`tEAG9YpM7&_DIi-!&$d0xS9&qqXxtU6-Pk*QJ?z1)L_NnqB{!yo zCiZ*s-LPGrKMKx`Xfnj+mSd+l(>Vp`sJOM7sN3J2Xq62QYyjv0Qii*Z2?A%Oa%gm} zfXcwn0KZv$@KyXc%?ocM;^1U~I_(LR)4Z({j+{3=+bXcL^Us`0FVpITe87c~ay+)0 zAaOC=*N;cMahc23b_$+jeLRp>+&}Nvs)!-39=xXEtb6p4tpIPwJ=-khx`_L+)ZPVa zhI8nXv~02>IN|MFgkl|HdsvED3o+y)o9uOHi?j;lej+%*%a^KFJR6bRffeWgd zkGy?-j6q)syXjXX>dqVX(8~YmHEovEw@&ENyMiI96GF@Hc^E2i{t7;uNZl3RP#d;b zb)X-B9tm~16_yo#|G2pvc3bSYKKc0&z{gh4ESFCp<9;B#oBA7qI+1}T36U{F=C^J-nOw+-Vv*LSE?Q5QQ-^_y3< z9I2S!X>x-3Lu-b6ajvhZTzIPd&at; zFsV!$GTiZ1iJ&|3$mcoECvN$zhTW0R+*t-R_=s!2cBvxfQ(Kv{zILxtO9A|U(=YN| zw`kTV=Eogp>xOPCJhvuXB7ncnf(+(tLT*dA(sw3O7^-O!nUcY}N(P2)`luh2)z5t>;|5M!+ z=a#lENk1)kupmm8Lq-xgQR1;qNcqj5QMrn=>)%rRjUQf!w#cHC%_b0&)?*YEDB#J}fzv!x{gohN*JMziBW*X`W z9O`PDZ$>%D1{~Sf#fbbC!c73rYuUXKp{ZA7C9y-KWWhWV;EOl&S8kD2T)PQ+<&{De zv1aAUE{d-Y%L%L`Gqf00e{3*Rboj~eX(*foH9!`!q@>OE(*LeZ34dADw9f(o&SDP8 znqZn-UEXjDHRG_1(9x35Pq3}xMRR}_wnfOd@6J+ryWS6WX9_u$JY`2lzKEhggx0b z+X#5R`&5M>mK}Kiids_P%*zs+X6uDpQKlQY8+CLd?ybrwg~Q@sYG?E^xKR#yQnm;V z0dnkm?IJkyzOim7*@~$wzQSBJ?+M{)|#16U~xj@1yDgnJQ9%ue4 zv3~H~Fr(3tlgC#*J&QJH2;X#wd^sjMZ~Addt{h8dyU33m2id{VIYVLmr6mDv3;55o z<9H8P6!&iEXv4V`sSVD#G( zQCi&gB762%L`Q<%6+Ifi@gmkSPsn#Gy!nSr>LRe5aIL)9UD@S*bk|OpCvu z&y13|vGwdNZiFkpn@Ix)^ zKf253{=b0Mwl(ZP~|8QpG+#4PMkFJ3b9l+u2UjQChltY3L%RVu64F zga80$W~^$;0Baj^R4_ux1ZfhajdY^kQN4HE=hoaUXItC0Hnx>O0)P?tB?SmIXN#Iu zOE=blR3*?0_z=Th0*L?fMN2}-HUyH8 z#t<B&8tCaKd&|n~&0_tCY>dn#Pe#$|jU~2Y5u0Ow9Ad1h z?YG82m_zT-m!N`5E1EY9<12!&l#sqrmwp0M#W3dGp{ECU!JsN$@tST`>0kpH(*%6g+v*Jh?&^484l2akwd|Mul ze%o5m(Tr}bZGe+R4>{n}qDhU)PAso4$6TooS&jKz|A3#!ni+V- z@eS=&kP#A&t~CfQ6u_!K7oJU|6A_qLulnk;W^(j@G7i&9(HK5Rn>aH)F^-f^HZ6?~ zL7#Y%1#L|pFC4X9AsFXdjg7$Bi`W9u2t(9E95n3oiRUgxX1?^l*9=0YS(j5J5%v9P z;Io2k_oA3?BbI8;Of40f_lr1a>+|TD^Kk;#MKXjJR&NzWDrl% zh!g?%;jUX$*pZ5+oiQ-OKcl=GBKu|d&G8$JzS+~>iyTKYJ18ND1TclbUgo_q3hS$o zqxO%RtJRzA%U_ON>s$e4@?eS1(5vNs*lH?v7q`~2CGgGg6h75KH8^4jW+^J6brM9X z8a>gnj_e6H1DD`X4gKSmU$Wj3?&nCMC!aVZ8yQ7x?C63YH}oN zuI?vY-;HJ%D7G+biBghXK`5_3+dko_Gybr;VXccafFo*Fa_=oh>kcvqMV5}Mtl`<7 zRAkC@=e(K=?GvOnl8!|2;)tYE?Rv?*^sKxlbh0?NXk~OipRyO340Lpwd+utLhLECK z9`9geP<{AGBS1ETG+@ops>N4CbKj9nX3>h~Ma^0%>zHVdD6m=iR!$A5T3Q0uZuf?l zzKce+MXs8lAQOO8Ma#BpQ1-_kx)}lQ5pe;~T=%c(+tf-W)ksE$&5TYyIEeaQlZ04aTXt>DFHBg3Z3arpTCV)H*1n@idLq zLgY{Fi}h+@{7c4%y{FIYmP@-16O#9tn&1?-jOy&My6qjny!1w@QKGr;6j>txsRemX z5yB>i6SgclXQxqD*daySj=Jm9sy}y@xPDr{E7vPon%dciUPCLI8B-7<=0~JUqnR4R zNcIU*N&(a^iADIij_aNihwJA}gyq3nm_mwaZ|+(BoyOwJ(}%5;RX zl=X&L_d-2RF$Ag+UfI+Xl+E$*+$%POThb9ObFQbn5-L}|W>LrM zgh`y(qNshAA`w(mZH3@8sHKy1ry83W_BsKvtiN-Oi9D|i^}-t`Mr7A_m!diBgWCCv z7NfvS#_AC;jU?Jc%}7*Ele`9e^WIi!wRw8!>n`S23SKlf9P4Ix88ojACCUiUh=GPB ztiRq>De_)fRlfdbFYdj0xqF$CM_pct_iWf>`dv88oZwV9It@gPk+wBn>G#3eIXZfq zr=^PpnQ%4+M8LI0jWn2B`1Cm2KEWd?D#Qk**bid2w=H-suZ$D1v4jCQ>crPxMH9~C zs^{p|XIBOr*I@Ts(8!XdkwlS+EFQ9{yUfz6TN|1sGHHV^80VX*bKIZGplP|@d*V~m z(Bxa(&?)52Y0k}K`_3Aj`>WsXo*(zyJF~X;OMh9Vm!F;W-Tr55eVN8zwpuxLZbQyT z^UuCN_+KeKV9)e}-R+K*?q1zo-chK==0SrmfoUl9Ya&lBtysV^3$!`-ckDEe&pjRq zQu`4<8#)t!d|C&pV9zxySiA#H1^(e1+xm$6mNIox*z&udZ9{cU&r z`y**XB=k<0hTdR7cXNSAvf za957+#tiMrKC?f@Uc%02YA!&y>Y$8pF9SLOMx)wgOWNb(ySt?~vMQc*71ZZ~8Uxqu zEIpejOeIc&OOf^{Ji;u-n3~KI6Q1scl&y0!sk4gvjaeapW)m8JHw3iSgrWRPX93>U_uOPa90rVr63GzlT*`qSpIEEQRo&82?sC#SnONDCGs$ z%-Cc#TSLwfwiCf42ThW~*se4#d4;%|_nLu$HlAo^m6OwrkIM1^PC1Nh<#(mlTY=M& z{apPI?Y2M89zo|kN#}l(L%(N?zGfs;h0avfBK8bGY!tfurPb7HbUZU+G>r;o^ptr@ zF1@Dkclc@u7sWOVYPdsY{nnru4JP(MkawpMF+M!L%cC;nvhG4tjh6sX^SaReU5u!s z#@CM~ql4{wsRhQB6wnG_t7_lZY*FQ3JBM~v?%i7Zsh{9^bOYcJulZ@RkK;SpNX2Px zPRTQD>=3rNk$33vp?>*xE^eM7lv-uG?#O+x+b;E0*+f|v17`xhBG(*9K#{NU-3W|0v7nfA63Y`uA${AIAQA<>X)e>e=up{Ma`QeH4Cwl8yA4!c#t2 zG#F+PgFS&$?28>r!nf;xez6VKRR6%0%a;8P)gi={=g6g(pNns*D0|)TV8kJ!Ll=H& zg%b?GP9U2ALDnE7g*#Ex=t=McKQ*&Cc24^xG5Y;tV}SE+{zx$ zEdbN5fjBZUwfPG!+{4w~-&)K$@0QFddh_(XGjQ!aU~F)=xIbwz1#wiQU&;bVRjf?* zw*}niutQ%jUIwj%tASK_?n^1sb1#BKsQkM={SIxpljlgS%SIBuO3@A2Un1MKkuIym z>_Ocm*i37H9SD{AQIjXH24*(pLEe_KcFqVUDB_b51r2YF>8C9{LOr{Kq}Ep{Ns(@0 zOxpD~wd&qt^M;ZAif)#qQ+xAjHS`uPlHu(1I(9Zgq(i-S=luH_+)RcU;-0()lUk>Y zG`_&E6vV>7p}AJQ|j1ld8w%RYWYA(Kt-V{pggbS7YM#*dVTb-qV06MQzpuDf}S&n^DPPzVPTwf8sBjWQ9Yu~=J$3M51fQ|Nogx}4A zNc9@ND>RP>#EySpKVb=tqdeG_DcOo|oZSDfIr!cV-p|50IZeIuKNnL51;HR$qp7mU zlBqOU%!oeB<1qhU18lIb`4&1kZ>ourz3VuxP&E2w( zvN7k6j;-W12)I*Lo%o<^c@eCVf{n!m-Xa5+SkVA@EbuFd@E-m@uK9RBT8zH`tWV$M z2KN>ATo4XIX`_bV#T8X+G5{Xn3g|pIg4FgtmAece)Q1hPM$tQT^ndfw^nLy{qRGSg zl}yZHz`16Xd0>(gArzWwws{z2%G4YBla_v?Umn}!K7SVVFPEX&%i-iFhP8P;zZk< zY7yRt#)NdgUROV@=5UwQhs98QvL&62FO*8V9@swlIrBEUV<+z6?R5W!ksn*lCh}Uq zdn-**`=5MLgl*o19nZhu&Y1@BZ~jgkWV+n@|AY4a=(q7HH*_2QCI8iq3YKpGS!<=4=BesbjPueSGKO1=C9QD3J z$&F+4hB6pvlPe#0WK~^y`dY1<#h(t#YZKdVWEKGY!rAHh6~8#Ub0y?>MH7mubblZM1(*XZdu7(tH9ryum%%hD$<`Iq|BaFM*z%%!mcGk)+`teGkRjNtSQ~MJRus zFaWj`XOB1b;fEkhOJdQgiR!xXOS71DI) z=h>XHWA4iPtA13tihymC&Z&QC36Z>WZ}Ab&9^iiquPk1<^XqJ7uDG{R=BWp7$2wDX zSk$y%Z~_Mf9vFXQb`v|Lvh&+R_4V@YXS9On$^bNVgqd`7`=KSt9|LBKup3h2FfNEr zOCD#mL*u56NlL;AKKzpRnmTWv+%{`DR^|e@ht#?T+P>x-q5nUd{O} z`i6w8?@J&M@ewaLbYtanMCl)(mYe|FD;xYYD-=KGZgyq~*Fj`F#?U2NQ>}zig2grn z;~;cg0UTHR3tW=K2je$2bJYwaB}IvA!Vu-Dq6Gpcp1bxU0zLxt*0eJ)KYt2@Z=kc? zi2k*HBuN-zGloZ-OB$Q4Ao1Yinj~R8`JbFq+n|P)u&38Gty4xwwrecr4ARke7@!o7mdK)F#r`giAMj64<)&jL3BY5L0S#*fgQ}U(u^tVdY7vb1Q zqGe1!N?|`GsPrRHQ<1tm_QtETgByloYgML0S;_`RG{!>G;eCR0zC#sSDWMB(b0lW% zcX+o>oj*_R$>}>siR*$L*C(kI=mNKh_Ty#NY4tmhM5^`XHovJ0SL(QH$Y* z+e--$*$23(Q(3J`4lquY;f6kDcDfJ=MMkFT>_Y`Wpb8jDW1f-_zCvNy5}c`ck!7oGHT)i=Pu>a{ zr>-=OzvlmU(c9DTEfDzlmm`V>s(;hzU&C%3=#mX^>)U z8`k%KorlPBn8Vff;3vjCN%Pg(BqC+}MH10bCT@gBn7C~5Q{{4a65a+QKyK9Bm*#eU z{TqY9ROaZ*X}}~XM_A8DuLE^skj0q1HKz=9x8-swb@iE?kfip3B-p(7Nvqz z3!aLi<1YQnM}!D~EC3NHBiD%5jDmp(Gqoa2GbDVlSS=ODPl53Z{e6<99DDY4jkQ9J zi~pY=;zNI6DeSQPy)AIo#hgN5npDQdc(V{8*&(MoK1)eW{JPrp^|);mq%_3h>a(9C zj4zcAbDE5u(kwhhQQvuCyhBqT)2gK#e9cO6I+&P#2FqK6fmOE=O25swj-WJFa?hg1 z%0!7Fn}w$VhGu~8O1d4EUWa!1(Dd!L;NKzwsbM$cMGCFjaXW&H4?lpPV#;YBTq9$f zBZA99+0t5ykEb>Iy;BNpmGAX35f#vRpFPz&fErp|r%bS-3RHVGX{gN!X;~bFqE$o! z_Pq zj^#IQ$HSE}$YmB~=wmQOSs_AgO3VTQ;ur@rR!6Z#P^Ryg+rNU^lk!lvln)z>2U$m< z)zq@z;{y;!f!Z-bG@ufY@$QU%JBLPP42}<@z1c#*@Eec6G1bQ? zwbw>58^_7D)xwWga7Uu`lTHoDzE5s7$VT`grwD=SdXH;-08+L zb0hS~NlV8Pi)D;*kTI&mL=}a_AvrQ!siz|nk%liZNn-WK5X});x-4;VrPCfcD$v;i zL}JLhDP6;gp-enm{ejIEI1UUNMM#_NS5I%8x|!oG^NL|$!y}=!O!lG{Ut$T;=6{V@saL;OE2-RuISv3pbvT zdtrm43hE$K3MD|{3s@ZTgz@yxx#x%U<9Ip~@Wz}Fav9}uZr2(>G?N6^BJlk&4#@65 zO^==Ci(}%I`IOE`s0i4Bf>Q?VfQKu%RnV#^L#;>?viRNG9W^eHP?$v^=>#d)JHm3% zpyrHcvb_zjfTcTv&5D;DA@L2K!JLuVr7Z&3E(ULG`<9F;sv-C_A7`n_A+GT(;-N2D za4-3i!IbPdBdYr2)I0Cm2NQ%Tj9bYVhnY|CUY^$Xg2&Bv$!PF=a z1TYV!;_vu!8iNEUAlyQ7CY>hA5I5)QokA%^BI;C9S(I}+K9*0C5V5QvIa}VtPMjN8 z{;83=>*)}+gJ+Pk_RaVTBD|C49r3+ zfoF^u#oAAHW&rVRp$bAs8mhKnEB5k;(X6u-zC+A8vKnbJV0Lx- z0&&g2)oK%07=+hxxTI4UycFL+Ay+0-rE*w9xu0{9s}{M0wOY-BI71BEc%b`+3pKGr zW6+3Yn4n(X?r{05mA?iLE1cv}R2%}mIj-?jB`f(t}wC4;$>BlAbJ=+hJBIy>c)M0F+x&w7rll%@4w~KRT0^0&cY_ z3Sg24wBwuM2+jJQ(=4RYUK|n5>3XdY%l=)MAr^E`s+4k-Vcpw}z$^unBbI_!7X&m4TSI#XTk7aaY z{MD1xL2w43JYH;HF5voeDL^(~B`=57~7PM?zX;s8}L^qrop7 zfao;hFq2){rIgi{9^Kj+jVIH#v%+>sXOtaHSnX;LYlPijyYIy0IUZtRh*aKt_+>lgpeB7@$b4s|FPDx!#cn+~+bJuR}pt@_!g*^va( zc`!oiEFxJopiG%np9#y0tO0TB9;@IP8P-3N)2x#r=i-{eB)A!>B21{I{REKBQRue; z3=I(+7^oI34H42i!-zb@?OZxD?@rI{lG_*ISo-1|XBcX5$Z4R&EN5AMqhcJ}rMKDh ztHBrGDgE>KciDdr4(#v2cS*-Yp64$tix9+P+KDwtL{3@}qQitAZEjsCR^Mv%q4Vgnv9fX9xmgSs z`x76`3Ir;OkxWvNp<%{n|PSNlBQ_dVlW(zcq76l=D!3&C~FvY?1BS~e!<7*8f z@{mO1_Rfoa#IpY4fYIxQC&d!WQ6m|ZIq2iEqlyoo=2!V;v5shYl)lv z2zYlfU2T!+AVi*;syP(K&Tg--UmYEXF3~y} zQc5lAS*ejk7A_1k|8`jiKx8o-C&&bQr(i87KM;}Ks zH%l`cKl8czc??~>Y>ymJxqZ2JNB4s_9P7|KbzMDAEj3n_GM)!bS%D_9%P!wQO;9kf zPCuhtxasT5=Z+pXPPKTYG;#A|s3=4xBglShDx&Vo)uFPN+N2eiO(h48Wj~s(jt^D8 zPdAQIp`6SexrGQ&v;CC}d(bN&A|c5VpjuPJreg#4V~4i0qX-u1m@%SU6B3rRO9!@4 zYS;{?J*IfG$AjA}p$vU}tof>FscC5FXmjPRcKNw^*(ntJ;l#QmHWjaP2kE7vD~3>} zk}ao*QW12I?qusVL>59Q%FRgfT>BD;Q)@Vf)=~i~5Bw2Q>Og%-ODrrGY)>pnC8^Wz z;Q%?ndimhTxvuXvb_{)Ntd_ljZL5o)8DT~i$yx+0PjH36khD(znAvru9WRX-C0-7Do08LIz*5$KXgu zk$&;l*rE*3H0$7n7o(cj!e+QiYQB5H08ner+t1Bqq~qpK?PKQcbEFE7iY6pfeuD0; zi)w^)8hTA+3T>JfYQM5#6&|vcmFSssX{E6t;tEkPO4SkVZ6$Qhy<~ksSRB4!+vcWh zqpM%u`LCSF*ND&iVCe*|pP-Gv^CKmh#Fv*yv9*BOgP_#o6Q1|{&rclp^bUp zm(cH4*_&ZPHL9SyT}pgvKbHvWk)s0`BAz|U+>{8^5H)Wp^bTyW8zbNfsok znZ-infY}t@W_D>f?xp&5^+U4knU0-Pr}VLRWdj)gtX{wHhasAdFLnUq)D2M%Tc+}l z-D)+#*u4j`;{Kjkn!2nlF>{vg$T8 zolBxkwKi>9nvwPTSF?tE^Z7x_ap%rvX=Ubd`t9-?8=c%CChb+1K?$@qr>!LrAg+KT z1J={nh{mfQBQhg?hFv!7Usy;ki>${&+c8SrN45vY-a-72j<;xLipHz?C-Xz;vqt)x zubfxkY=t|+`Xam)1CYdYiwwG1Xmz=Oj@+wN3^%|<`Tr`M!zd*hw=8%@M#ZsMm*8c6 z6d+=JO5CF?(jC@}@bhY$f;-_TiJL-uU^J|=Wr`AJ8WPr#i_wNVMk1YOP9R&^I0 zn7QeU(K~7bQq8;|itSv4_xzcbHJZ(a`xHhIk+^yl%R`bShEPwpgj{7J%1a*54Op`>S5|_v_NzE0VPV;1~DTUBC;tT%!jD&2l)QqLdWEvpXiDf5&mJu^v zMxIt$wV0uddmq=;1wv(bR6LDEQOTw4jg^d-;fxFW+;MS!zh`^t>zN|FI2EwxdnP7S z#onYWh-x9K%Zrzbpnbh12u|XDa{QORenBqmyWQhm==dtzQ1c;Z&|al)izZC(XYv;@ zv|Mo6*3xR5RVosAfxp^7(Dy~IbocHaS+yO0f0?LBknuuZfrxpY~o z?laT22}WY}y`;`{4z~7Y(mVsVS}DGwcED-yIVDqTp;5uO%p%kJn$}ikTg6LryBeXL zPW}YP_J|j?I+XL7>O!k^=!{t9XZxufLv5awG|o9mlk_I)avRve`wZIAC{s$bq?{(H zA#D*vmaHPnI!Z!NMOj^H`D08MC))D_aCP4H;+0vD24J|n%bse_PZMKxeLOc%4zt61 z&!p8H{k*ojNiSwQQf5lj&sB^$_Pxo{{>Uy`gbljFBTg>2p`P98}C zu(&}dt=GkVHEF?!!WY;exnz}OZO5ZP#!xm9ZKjp?){Se$ZQ6)?jvssFq6+nCnmiBk zdJWBU(`%Ma?{g@oe5dAW{BqujZ9Yi6FAa2U{-jBl>Cdowe(HUt55)fXf7_FyE9v;? z-#I{t`}|G3@+Y1}#NQcUnOVO%XuD`6Ipz)tery z!2B1R$*#}J^yjm2j_F2*gnp&qu@JGuMks};plB5eyvkVE51Gw_=peG|-utja1li;BM+%9uu?TEMxC|I zArw8F%bl@o%Arr*zr%qC&q*^Uq0m}<_9uSAIr*f2a*wQ&$Hhy(d^V}I8)G7yuIV_vKtd5;I2bc2AY+s_cKlE za5X!D@={5=cgc(7UGBtKikZy&fw>niV{3?wV32nRr{3@SC&gcO7l+>9urGd}7zAA7 zl22o=Qo!pU$tH2gyA};+_w4cG`|wXPA){3hNR$=fh(IX86kPe%6l=je^1TTs5#vWf~Z9T`eBioSrWd9VQwv>`qUc zD{nf4>}=X?`){{HZuI}jxmx|qpPqqHPPTKF;4+bg65N@v45^6pHg|BbV=Odh&4F5qu zLHo{a0>WUzTIKxbl&|e`d!>&+qpPL zd((zS5>K_TtMk(y0gun(67XTR>FIrzg`W2zuG-qsh>!q1EWB5x2F`YT)( z5SBc^o;K;IkBgHsF}?4@X)S(a%K?_XG8MsMHWpKCjwdTB;?5I)*%jyVYTgpjK`(?& zI%nK_XI19B2}x9NL9<=v6Bq+=3LY@@HI@W46(a^`o(8w3# z-iudQSgKjBcx`B`Fo7jBsi3qyPj3s2-+lUzj!Jq+h(ZH6#_)3#rp^Kvcb=6c*rQMF zf&m^t<{P4TEyrY1MXNpZdB-MJws-#&loF1hiwnS>#hjD9z`btZVT2TpzU+@w6Rrc3y%PW$Lg347+yh@p|D0&}0k4R22+b zXAwd1>r69Iit!rjAD91I*z$4q%2%t4EK{&alEN@v>&>j|7@k^Gxfd_dL#FFRc(yOC zcyqWJegkRWCgq>*bpO@t?rnSeKZ^Dmb6FR)KP;G$kxz)YEyWwPR8qQSO_T}k%=S1I zPyMS?lG*#A-VCi$_kj@SNQM4PbM_=vbNdr06FV(DG0MyCd3kzwA8?TittoyW#tKnQSNpP1n)|I@6iU6v@m9iT4?#I^ ziZvTfzZuT*Av-U7zCn8CCGFp#ytov2v#kC^Tb}>?Gjy-`r zD*@aYsucj2l-y}2#!D9Z5$752cSoHp_3T%=No{P;>@I(k^ZEQtjjuUAmR>fN3yrFd zd57bBeG)L=_fvW!xOYCYt&kBs!S#?w>nFM zdNtW5HZ;}6zcm>iPeJcK;J~}H@7pFum+2q}^>KoOJur=>o0;jE^YeFfG}JkvV4PbV z#ySKLVPTo|+sdozAlW2u20A zlKl;JFtg>U)bBgZ$;K8kn@k1AH2d>XY^dTXMQ}vr*~BJHaRghF=3DGycj3Fh-lE1w z-!*+UKKIBp z5$Y9&Di~{KK4`w?R^~T_aAxb3~Z8R9Rx(L~%uwwKv-n)4C9YqG*p5!qW9HsKl z=(5CS!6C1S>bdvXp5lb?Vm+_0(E=4*W|s(_W!-J&OrK5Tkb z+9m!RL1Y5#a3Og$;jo$HaCo$*2isrkXR-VwjlZ-vGqR7bTeL`ZN^F@ImVE^SdAnf86+U=^w(w)4 zefyg{M7+FfW##3EBC(7@ zwAUma`C}WKbmQRAoH_RkKl?0+hLSY*1-)n}Np*IEffkkAytNNUH zBx9-l0&5ALuX<~@1S9&^;@X38V1~O*V;S0O;-=7o20f|mGmz8w->TYodUPn=1cM$c zZu6w|Nm?Pg421S~64dh-m%z6EF*b`k#$3`{Q;c50w|iIX0KD+ zXH|DEU<9l@ULlRsp_Ioo%Xmo+BNZ!ueG)P!*Jqgb?VJA<6ss|Gv+=z7#W9KI4}JVj zSY__yNP$tZ0I0)`I7Am6m zE)nNSeGqFzr_}A3KnFU^$zCM|ry_!y(webj{c-8Vk<=c% zV%KTtV3?F6(nQ*vAtL5gcplCeb=9!n#!Z|>c|{^>9rrbW$b+FWQp3Jfj#lgG$hn`z z6tPooQCNrvvU=V%)Wi^|CBacQ#ddVY9|v`ENN z3Ij5ODG1>l%#~je1w}v|9;0RZk>82pXIBdFJh5_2kOV0ZUcw0|D6MFs$JGfZWo>_t zrDH7)VBp90xQluiM>xXid>CH*#bYS}TZ17+6b-?pZop{?K4tk`B(c$J z&Y|SS&{l`oDhVW828-mqJU|s-b1U`|kwf#d?T<%SlslkHJTM~~k!b-S7d$br%m8NpFE$8w|hjXNk&_%JavbMWjJB4(Dv zUL#IX9OSw}8ilnx-NsWzndo%eLlz1N7F(?}YEB>=c5#$Fo8> z0)dDaBq=13iYcpP$Z@j6mFe>6xW`GdxSXj7^&w(UkjRk&0?kx3(CJ1i#{x>0jUE;C zHM&v~?KO;p;_}O2xKt1n88a1TrlhyyM<-8--5!xQSz>RHs6DMf6b3c*{iNA_U9|VU z(xcIZ@R}M#q0(7uZZ!mJEGT-f4V*X-iQBppaPb?9mJ+C=OURuRanzw;LZ!qb(RK2A zPt<^Y&e#=GC@C!MUf)wxQ)OeEjfht(R(4T6^L>H_9#H}Xr7VttCSqt1#foy%2LVLi z-dg>6T-lLJWdK@7ULH|Eg*zy1=AH-&97m^=%-(eVz1{u10RMMySwH`H1JyfUKAV(8 zf9Q4aXO2UsdLYhRk>P;<^b_ME&Bi><8l`pEUkJ=p08BW`?~u42@kTgzq)`6S-fjnDdLDUU_lA zfe=UxiD<|K&TnT?ZX8XI@7eeMs6T=nl$0BYsVT@p3F9daP&MUhgR8_sl0in)E_V-Q z=yQK_j*qYsb7QhHN&Y|1wKgF9V?0`|0JdJRd^0(uuu5rXQ)Oqo77-xhMokRydevr0 zdStp8@x)!I`5nnti(<}$Gk!V4J;Rhb)Qvk!rNr*iYLwEe@LTf0a&&}srD|tOP^YOgDnzlAYdphDJm466AXwOE(IGo(h?##>C5|d>ZkVOaXMTGwbuxt zR1Nh&3Xlw=Km{AP>D2l3ffu%;D+mV>;vvd0l=pjZW`XQ8OT104;7Id> zHb03gQsO5Rh`Am#@M6gwy2P?^QV?dj`&aY+Zfha@x6UH~l!Rv(LYP(}b3jDU8)~hI z7irt461^0_0S`zxj4R^icd+uuH55>ac^8N`HocnP4mccz5~5n61gc76+>_@Fk5g`n zg?o=myCg|+9FV3RFtx5M>%9+i$Lv-1H~><&c=FpP7pZ=ALwU*~5%<#orM(Ve1rLny zpfOFsis8epbX1-r&@!&=^f?mHlEb4Obx&p zU|tT$V53kv@}Ps9DH*gc2bC4Q)T@NrJuwykBnSt~0U&@dtw5X^ru!p68-hzkMiCA{ zmL#znXQXLrho?gS+{zg5kfU3KKY zz4PDGdizEX6nXN?EV*r-EDfC84xJM<4lXMuYw;q&PU#+Dgr>9v^a*=<6a;I@1cJ4NW1~lq+Bn=~B+(B4KR=>u#+JpgRD%LO1Dg)E z5_ENHFl+ZURnF(*LyPq*3il%{jF1#upw&ghp_)Z!_cjNPt^;}-t0Ht$+kDJeDA-7b zcFZT0A6eo8fyV}64pW9>juetiR?c4@ zm4nf@$;GdKJ5R(BlxdamsESIv39)!b4>EhAh7L}0S}638Nq>1v?-j^W2$=lHGeh9^ zG3Y9%w@}9+*BPpP7ZI=LOu@W5NS`I5)EI_PE-35pK5JdabvHB=$7!D{{;i1UP{+eK zT|q5HfG5L=iX)R$y2ca7PV#Rzt$w4+5m!~l%4$3qO;KJM8djuCnFZUbElFScs!xXN zAli`HXaXUh1O_OsMjAnCOcK;mIWF@OZxa;%CxY4m?v$>l0&l&cG7==sQ?w%I$el>h z;P;G+UtN^OTe2PyHflJK2|0uA#*B$mJr&o;Mb0kwzn7RIzoe*L_q0KLBuGt3gJRGU zkmZQ=4zgJ{v&)+lhy_WdctSN0foRMqz=cE!Jn+pn?#4GtyVs)Qd%Y;T-FNR}%BC0D zXS>*v8>GbZ0gM{LYnoGNPqpbH#mM{}gV_u6hI5?e(@WTBhrKPQqubYWoJ}g`N{Wy` zk(0#0pYN-(283Tu-5AzS*0O0qnn~_KYN;{pgwKx%CePh6B{c|F0SrSYP~}xUAbhV$ zaLLXi5P&$6pfJ6ZM=nC}%ALS`!qt2R<%&0@Apc(=5N>^gre%1@k;Ex0Wg6ollt2aZ zvpEXx1^9~m?H&g7o*{tD3{zZ6bqqEBN~v7jPhD)vRRt5qF%I);S%XkKz=jgd&x}}S zbUf722&d$yjWx#A8xNElqznkJuslvW;)b0*EiE^NdP*zPSqFSgLi#YS0(g;ME?H!& z#WOdksIaMkKqzX!{2G~VL>%u?h>?)11UB2m4Csvo@08o<%2h@iO6p-4(E*=CK$kVW z2Wslv846M51&@f8S~?-C4jCA4=|CA5#T(TuAIN^ZB_&@CVF-da$Z4v@3Y3+RTsq_w z)D%dDE8SNIHk3Ygp0GY8-G20d2_}-Wy11CK2aZsY3_%C~JU6=*7}Al5WEN6(chSIxAjUzUL?t0bRfOxPSSWgd#s z!9zL8znJr4hmypUtG-UmZ-;h}R&TP%&y}8X0&!Mclr|oQISrRgiKH{+dPaHp9Qm%? zhcNW+OCo|s#f=zLr_e(6mw${UO2UrZHY2#&^FT~LbcJ&>b7&Z;)n%YxwMbNpB4)%4 zHa`?KeP*{3WJZja8|Ii-@m)=3M3{n9`u@PBY0U>$rm!1zAR7mmh$&b7N0?Ifvo8$( z)C}D6D+e9W2%~aMlMc`+l9u_pmFA*eKU?_FL>)+D2Pf>dR=Q)7P0RRur7 z^8L==ek1@jdS~RqG-_KuLip~TTXIDFMFLFA{wM-dud+U%f*5pfBrXR^5ecZcp>Dp+ zlG7>CYR6s@NmH(J+z=s)c-`be4jUV@VHYI?r~;SXt!{0y8E;>xCyW35??Pm~J#&?x zLwBUYSWd4MQadRSl3a$3@ONAX?R7XPFX0U17$aI->>E3mbnbmw*wjOQ={?PGBGJ@rHrMp3v9P^ z+wLFG5#_JB0axn&-i~^TbyN$DGYu^#ig#K0Yot}_!kaM|j9jafs(!OlP$?N9T;xac%4$puSw1zxN}vWF^z#=wypV1B z4s@2SjsQV976QyFrIs-QcGMOv!diHXSgMQO;Np_czLwqx2Hu1zKzor(Mk;TqC}k2v zj6k(P1>_F-JU$i?xrH~s(I3px=h6B7WRarFAX6C?7-}Wwc;*cb2{_*Xt(TZ2n$vkK zLJOiC#VrUbVv~7kA`nZo$VhrspWViNGiOWhFt#NixZ;|*EJx=Mr@aVU6tgtXb2(9_ z!|$`7)D$Hi2R0I8Pzz|O+9Gb!>zu=La*Fq7lAogWT`HgA<~6}nQYtG8Vnwu811hc} z&XUKCL(lY8{_~BWrkQRs>@4_uP{pz0tnRDrYxdbgexx^+aoc)^4la1X#qga8Jw5^}2hNQZWZ4`0w(`8ww&Lgao(% zonK??zjTE@AN@O1>)!f1Q~%#NovZfh;xfg3zICpqE9Cf7G*wa=PW?oHjHUI-6N@;&-s(>ojhTY-daj)Q!eq%7GDiH+4!)04BO~MqB2o1__7rtPY?${k z%9{AY4_xtIwM$AJxLCB<$ssCKs@7GVZG_`8>3D`o>a$$^{e}aZug_x}3&&C35D)MJ z?cGIWFhHoNc0@EfaF}EZ99wWL2qPlCVGyx@WoQB*fwTYytPiJ(rhv?o51#)`N~jJK z$F7y3lBABxJA$Nv$0x|{?3UMvNs$5dHD&5hn(TBLCYynOz>H2ND@hGCk{M=ws5Unv z`+A{Ex|Y&vV31rG>tk9WkxkZyi2>KDhsV=~)qlgv!s5x&R?ZN2qFIyy`dEB^7ipY> z?BTI`jj=0Qijwf+(SS=w3+=PA?KCYd%ec*L7 z-(3g1jtbuw`UfgB3gv!6WX}*I@t6i8qt=U7jPH^glwvAee|0X<3q=p?BV$cu28&&_ zb-)QY7q~jD4_snxgd_I+?S}v_6)fO>vGM(IznVcHeJoi==HvtNW$cga;`{7l2QA5q z6@MqMPYj!$th3A;78vPx6eyFOk4E2ESt~49l9bm`*j(;_oPoms()+b{nU{6!CH{BB zv19u2CKi=O`EuSUlfRhoE_Sf9x7A35?<7QPf5W-$rJt&O`f^>WlS7QIXn?~A78=84 z^G2oz%dMk4LgY2G5x9gcW3=S;?2uTP}T3IlG_XetMsr^cE^aI z#*Jq@r>}NLan&T)1G9_ClJgcFKxgm|9#!eGT!$+>aLhT$rgc=oiju0PlH9@rL;l0N z_51*iF?to;wWvkGNeF=PGSYSjj&F(8u&HiPJrJ*u-PGY6_E1{4w7XJ3N9N-y6~wWj zmqP@X2=>7Ksi^=8Q3_-NT588JQsx<UEt&3{qA(>$F&PvUEf*4~sU>b)y*rTT zeV^&r+5m>2;2S*{+|_y7)+HfZXYH5hI1nA)*T|b*rAgs)`7#{}{9ugs9h5a-#g{=T z)6n}3ZkDEwEi6Ca9Y+$W?vHueUMuOqGy@9v+xwhx1jSfQs`MfoiOo$7ZHSjZ>{+6v zkvk3Z*l^eQn0*yNSrl9!w$)Ke<_BrDNHLX4=b@1u6DUU_340cCNX9yqRy(fl(V9e) z;CKcC?7sB+X~f|cPWjB`YIcod>u}MAaFg3K+)oR_sJ+=`3%kmKa%T?ayya@J7)IZs zIy5O)OMRI(-d9Acz9qskeffpcWge9mOA*iV5o#cL##9}xkwwMb^$Jp1Y3_UN4AmAn zWowpC7owquJ-`tULg;C5#rV#t!=LdCB*3sFm6-R1B@^z1wWD5)$CM<@t%*YH-I2(p zLtg2L1Ffbg8@ApFYsb9+bzTCklw8El!`w5i6yG?3E!7Qc6uEK)$l6RVaeX$c9P!K% zf*YJxKMvQF$*KGz!>R4qgtfR{8YQ_g0IZ|8QKdNd%XBiaR|DeTSGQvtl&=rUD-mbm+;~k(wS9;SZvPbW)<0SlTVNjTVM&39mk8K zUeBJx)k`$mSh0@;B@k%=1b;h~OOhPPuQtXDoZM_Hw)x3LA0&i=DhZSum0ZU-Cvrz( ztQGVk48dYq;iS5JN!sY@e63nvyEsgP^~8VpLdlVEUPEHDPaLY;dG zWcY%FIF zsj>iS78H8d`jcknzQJZFzMaw9-j}O8+PU5D73DF)| zNSs0y*o?GT61>R4S0mM6`xNZYZP?VsJw7~jQD(R1k(&O-V;9iGci*g==^btBiI@bi zYOJtCZ?bO-zSbeVzZ@&E)L_a3SD7XGIQ}jaqf9yP`>@0mYnCV!bouK+Di?|P6BZIj zD%^8bx-}}ep*$NUJpf$63FlQiB_dWDGSY8Jl^Thfk(Q@d*^u^khPi@MTsaUJ5LSn- zc6Fu5ie%Z5O-fp)XBV9abfQ_)#!hNn+H&!J0DlPHpI%azv5Ve2ItSOD8d&hA<0b|ZbtlN^r>js<<=`I4n=!@4YD3~T~u2v=Re zQ_wI?6#Uqk=TStS<)VtI)k6+phHqzE35#}-ZL~~Bx8lSwl$2P`nzvuiiyR%X;aT2> zun0yK=jhS8(D62CU%{ob*0=Q`7+G0GaQ+2@FgAopSV zk~jucbpN|$te?^IdQ~o1>Xc9Kks#U)OtYuDe>tLM7RUYK&}A;*jfW=wbO$tfvSK*3 zo!FDXA4?}23v9{6-Ap-=6sY{PeYQWo`rxGIG?8sfVhT+R>O<+#qtLU7jtV{&4jmqr z|21UjYxfj*PNK04rC%jHsd78lh^ z^}Vb4x}VhP>h+dlm$Mw5A4sJ_gx9v&UB+&=9LsPf*~Jlz9CK}sm^l{$mdBL2T!|iu zXHc^pblnrV`f}=avby3~G?jP9(*@5gr)!0_3U7UvL?yr5NP6bWEz#4gRBEX9@VUV8 zt28rVCF%62dI;O{`Feon7(zTRM#oDs+F_cSvY&wy!FTeV=b**lH~5{}=!`yh{suZ6 ztH^+h1F2E(A|Tctk3gksJAZjs$I)foL8xfKg{&D@gKvipy@Mh-dO>wZ_*l1CKc- zATX@tew8grUdpDCMXqwH6zgHjQg*KG@UAbd_+gpDr<{Lu0h{DG^PQyLU$Z;O^|(C9 zb;vPT4qxLdbe)NHfALXwki2lqyr=ewm0dOo@Iw==_+fghm|Lz;Y{6#>gUnUEpfXCI zLa$2;V*w_w8in3Cy$m^+=|rh$f$Ly;BTpOqRw}hwL^K(S<=N;;>V2Cd?hg)GT{63SBfXfC6y7u4*DduFQs-yP)myQF z#V<+nQpELS$+DUxAI+9`)Zk#wYIZJrphqYk3J3PiHnG}jdZ(A&vk}Y}PGHTm>!&4A zh;i1|EtuFq^IgPcGINb_<-@Z;^H*)i63y+;N?cc+ys|x394ziTEuGKtNbhSByZrfD z&n#BY4O&2n{c7&$#YkT z`@KdmNmEa7z)BJtOxuIuViLqqKd6L8qa3h;uUno|<;0sm2hmoV?f;oTe@Mf=jJ_9c zhEAsgLF%y}!KE`!rDll>H+;^&4W`m|D7oX7zeWoFQeu1QXf#813nVPJ1LG$ld-nT; zgqEwH`q)X9NgP6sNR$)M+B2mYP%D2Y<7&AvY6+hPyU=nGgk~(?msmXAfGCpuzEZ%z z+{nPN2j?qp^YG?ayTxIZ;RN&nfXmZco~SKbgeVq+L5o@AP0Hq5+-7J-u)6%WXvh`s zjBwj&W6{^~Sc?DHd_BR%_`gslPSOyWAO+x(gh z3mqy3$9P_waPW;)2|i|C-$H%Cw}`XQMY&=NENtS=@5`=1{a3x`D8KkjTm@!~_?C=| zUP8=~%-Njt0Z?0uZ4V0;L+|R?ync8cR5p%QB01;ZUl`4ybKdL_S2*xbZK)l!m9I_j zr?($|AMvL=PAH4iYVwx*5zY7sP{pe5(`V{&MK%{{Re&MsE$OvW0nfaQEeB{;^W$zO zd*j|GVeCI<&o=zy1;`EMydJZHl7G8qa=1F%PIfof_)fxWl`nbC4w9iT{~g@8zC3is zI0xAK!^W;-Ld-kgER%r6GO}}A=E(0Oc{B#s$!8?nf`ePTYa<9M<7J8-?y?106nt;q zyHhb4)`{!Qtob3!8k;~`1g*&(+YV*7Pvw)fKAB#o75@GkK3lPI zIkunUuB_EoySs%gcMY8L6UXY^W#_u}>8@jS^k-bML(lyV zv)$2QYZxvM=b`PD5IC~opGEk%TNJRH`|ZIGUY50I`|{}mH!or}{9)wcG!>z9)0DL{ zQ0_!nogY+A10-lBH)t;pTpqrditYVqY2@1{**{%)*EJAb@`qvjCwK{dm>Xsb}s zdQjv7NrlZon@8ZrPWrY|p5Bve~-; zzH_x|A^TkO5y4qK3nPD)@rl?Tk9gV%vlA2N^fvNwK+%uQair;ehO@ZYk|TDI7LFH zthr(bMRtVgh*Xg}vw7r6S11r_2GLRg^AVG6BaSsF1S6usJ)>4cl~}}A7}x#qaAyjQ zAEZ-Z>J`8@$t{ipw6~|t?Jy!wq$!^n3meph2rJSqwA>Ayhyghk5hfMZr9>r1U#S_3 zW)d#Fm=mHykn%Q|fP_dH5a$Re5&8Rw)_Q!Q5rzyE6dN*4mk>-nj^%`OG0nq4me}6N z&Y$w5?{T+4Z9GyLg@;Q_beQds256vzYl~gbZn-%BAj}+E9m6VzLe9#Ch9kAKTP}JY z!gv|ZpHj<;aIq>m1s*F1H9cF$qY|jGTp%*V&zJ)$8?sn69lG~17=b+yaRb^j0drsp z*g^o8wV+!s;&0ew0HS(9Cf1IP(I_dXqk$w*v1Pe08E-L=(pJC;;%i(qypwyuV%lYq ztx3G8JpVDATQeeH+#u516K_yJcdd4oktOD6@ewDjIA4>2@zK8xL6onr=A{5 zEy7aa-q7P#3RsvDI^w2A{w&FyFDW8#CLE-xLQ60fGUV5U%(a|)m7}ockEVgM5~F6! z0jWHaBP$5Cis=35?O1po*ow?dz7KnxP zXyXRXL8(>Oz(>ons@}@ z8{(X{)l*XQ!_r`!`Fj=Ph8KGtK=Cs#C30oSnKmh>P~Wr<=|!y+v#_0Spy-Dkj|bGS zgE5jBm1l87ArhhJn0{T$zWt(j(158OOmQUERNIt}mKO|b0jETyR}CybDNuELKNnF9 z*FOI9lOpf?04AMJ?Irdvy|b{rDzez~1Q!BK*MOXo6^4q#lQLH6ey}b`3^%{tU%h^K zwO>L2@;11;CWxz~P%?-|Hm~KFnyE~FcjmDR)c^Tq6A4v72%vO0FcLE8m%o%o zTf@^<8;)IU!~eG9Aj|3U4bV&zapb-$TajD0_veS#OO56W?-cSsdd_IG3>_W07MJR1|=ZBta*cPE%0fwR4@)KeLAQ_Bnsn-&r&jwzj9G05_Yo;5a4`38?ifpCDHk;J<6XI+aqnax?u&6+qQr_2i+ zt*Nny20{aRG7&a{O^DQa5Mx`#Bod_zSZk28=kLTHa61NcO&}l^8Uu04P~M1090Gbg z&cK>ELrWnyJp+dUNr~kxadAPt5Nr^}IFAR~tQml7beKo8$JuU;9+nDK*f@RES$bGG z`1lanjtmY6Fy&}vLX0CAl4%%p<@pH<8s&CbLr)$P1S*4oOj;p=A!gX~1TP?AAYAM` zI0r@gJ=?z0fzf#%kb)&5DQ$Hg@3}-}ULZ;jW>6E`f!xI3fuVhcKmxr+AsP-4l&3RG zQVicUO9H#Y{&v`Rz}0=Fk$pr0kO30lz)a~J780#C(4Qs><~iMoJI{*X)Sth?-ljxB zQVI1)vhqSG7*#2Q6P#%r91FCDk^YhCseM9g~a{M?#HIsHoS{J}j$89O+?REQ0uZlv*lBGsJK(5Lq)6$WM_c%LBjE$i9KVG9U!JV;u%dxJ64VZB`sgsG=<;BC#H*V-E)luzXFTv|9|2`EJnKmg8KmSUyYWangD*dFoMq7GXiNKFu<`asWE1yW^V9^>=wf5*H{ z?;d0zJSj7E%MU514q~NoP@`{N_T1?su8Hy`eKphrYD)^EV5$?&^%)_rV!+^~(F( zwC3@jd2Cm720t4ztDcl-_?{CRzK^Yv~YK+ zecJ=qYkkrd$Z!ApJ>vr+&{Wut98paNvNy_OHs1 zKUeSgj$XnitG|tbVHpt^~_v-6e?nHC@_EEQ>H0DdPn}_h}fL- z{+s^={v*}-N7{Aj`MMvqJ73)`x{v!F;2vVruxdQUsJ;8;-!uNB5a?B{?F$+;jBfr1 z-#iqs&Eq6lVUB{aR$=OAS5)l`h6)gXIRQ-sITdM#w;YKb+IlU866`dTMzO{_G>F4( zLi_NS|Ef>z7k>&L+H$3`{ncV>(hQ^qhGH#uL&$eTK#XEa6~wm_k-trS#K!;Z;mijG z)CrA;W$D%IP&3rEOL2-yuBMilB)HIE41z-;BbN7scC{2`YjwtI+xi&#cC_Jn{L)Un z)m1^G0hSpECR_xhfHIhod5A(vRW!ml&rTo1R3pex;MCPsLANN88iL3(j+cO(DTP`) zf%h@TVQSlU*~f*&>yPU0(9!|*OV81gL5Yw6IRi0a^9bWGKtomJ=l9j!p`#PF=?RQE zw1q}0)OZ24G31O0o%0P^eC4brZ1@ds*EE%-*ci1}(Z>LIy%8d6#GH2vFMF={|5yqQ zz+gDmQs!icK%HD#nDr=v7RPQN)9(9ug-JD$><_-Y+pg7L6P~odX)Ov;sTDh^AYRmw zmE>`2j(~g3Z2UY=XovLB-eF6)eT!C!WqEjh46h-qh*5x=N-TlKB8=5hRTFu+v{=k) z#P!4o9q|)OcUb0?SSXR&NQ1|ivjhLZeUzu+r4NIRlY^{6fb=!JSXG;@~P51|4noJ3g*beQ4Tv5jIjU}az574vPa^~LHN zNwZLKHT4?`0gQ(j9ucS5qaH#7_ND*pz6>7~{%5arbh^DbAUGCN8D&rng~Y8rgEO+s z(7XanbtRo$^hf%SndEWkBOJQ5DD5$iDmkyD@+M3CYLY2du&o2$XRv))YmtL_mCxdaCo= zg#KAC;|&Bytk4UHlLC;G6*?hX6;hNJ@aycnhsaxg{Bu zx|*S;Jj2Pz4oLvfB4o<)AcueX0Ye{zsnErvilAXL))M()BfT4AvD zGcI8df3(F5RxndGD8Jq&_Pv_TOS2SmomF)@#kE#@!tY~oq}<>cLjkkf-1z^;#|W#) z6E$KH%wQ)pl$uhI<~0HXY1d`MeFqG_?mOeBf1LNaDb26hf=9i9_uX{v=l5Xm>q5xQ zqB(UE>b=USI3QW2r3kI6^m?s+d@N#b9*5aQhrei6W6HHuNjQ>1EKq2zlgeQ{H3eS5 zS?&9~nf*~YFFR^+@64&8y0kh4UG4fYoEoBs?-}W;(6jN>7o8tyrmI7L^;2GS0-~C( z4PBj3cF`J+XSy}?Uq$*ws!*rt)zJMRQx8{14ox(Qpt2AU0ssa8L^A_K08n3L`_w3) zzppt_Imv+J4U^5hz02lR++(}kV5>`hHfFL|E}u40Kqf|MMMC0Kme`{wg)$G zfiGN}S1)f1>xK0|N5XKjqB5xr$-t_@PT@i(To?8!hvdY`q05l0Yhy9;k+x#5^%ybI zs_lDC7HYTu$0X^tzA>e`6tfm#NSF}(000>PnxO&!G$2SJ5SoMw+mc%@wk2lBC}8oy zmJb?H*;fwXGqB;OTTA%0#&h5jNI|`eZkM{q%ijeOF5_?dkfXo}RRietPYf z=sVB;dGGVJv$Zoc>~mUb&epfB>aX?OZNBxIbhC3cSnbc#&acwX^~^Oj^t3*;e(RTJ z^*iQk`C9zHz4X^B|6u!e>wx30mp=Qiw|>vvAFu1J&;0$^uX}gW?yU}7)PLqLx$hU? z`p{FqefDi_r>_mI>uB^#Tfh3(M_I!qN3EG+orshtM8$C0&*xO`At+e!;Pui$+SMaskO}+EA}9 zSHQ}4pmIA;fR_ozN3qn;qxt?RRnagViEJ%k+-F84IC-5?+E-BS$fIR&W(yzh>xM+; zb5Q2XGdAAwgjfQ#Am_>y05(bFqUKOE&uBO#kN;J2|A&EEaulwj)mjEtJ!Kn~REcdhif< z=B)I!*u!7RQ(=fQDk8}*g_z4%{UEgu_JJEQADTLQg+e`e)(`IHH7X_!ZRuwjk_21xS>sn+@EEUR?B zSv5N9>=j}O)Iz5xQ6RP^Y_8z7=w!}c@1)9NT)91LX9$q~DEwavmQ~*YQrJnWL*@ zYls`-@FEq+?Y%?88bh$j+m^4D9ixis_$w~;w*U1qU;7$G>0bi&zBaO@|L zfIjwHnH{w9;BBIT2{Y|u6n{=|3obT=lJA1YMYBD8w{Zl{|JzV^J8!m;V30vl5efSS;D%vA zmhRw4&Wj40wC7-zuq(YTb_25!%V`F8u}a8*ZyoGniaO(Oy%>FVyU(Vr)?%jxfy60{ z<7Fu?;={Qq->5R%ZBLF^&Wy^zgWo>2g2{F*=8QJg6+3$IlZJ?1T&}Jr74dKnWRxVFi3@Me~M?_Q81$JY_f^ z#_t_Fmdc8srsI^+z})Tu!$y_hypE*`Ri62oYVFiiy|F7WW;XYmse zruIAAOxjx6S(Vx`=#~&O<2enHs#GFl;j%aJO9nN0F#ZojnbXrX?f#i*?{a2mECBJx zqF4UD1-T7L+8=ijr>G3W{YG+|+TF*Qtc{W5c~f2NlX2FB+WY9j?rK1lkW*1Kvoy4` zHFN8Q@m9}{m7Gjm9Hlw49f})@-k}ONV+{`rC75W`|4;j+OU+&rD`&4 zsfDqU0lAwX0#TGIk?cJ!{dT@>mL@CGZhIA{5sWeAJnpUQ?$6)!mdIgggqxH*8lt^v z$qim3XgU|Fa_j(3OYQ7Ep!`u$g)Nb^Q>bdO*`Y+UDkKysqkgYdI1N|37U2(5RMGIY zwr$Q++m%w9{+N#f`Am`X7u@8S}9_G>7&l8L>MjRgv$fj+%mBl{I`Y zrCP;CqtwImu{Qj;ho(Yx4PbMKd|1fZj3*@>Um%?sWJE=>_quv@ns@YJeX*7~+r9X2 z`SOoREs`%0KGog(!m@Yh$F+g$wDWYk^tq9j^R>^Q(8orin`RTo&6|%I({Gifi-;RK z&P}eyM27#}H!-Y>*Q@Jnz{n*^k@<9uBch}wNUyWPL~8%w9Fgx5PA_VYK@4&wM4J}g z20P~4t#sCoYtUj>EjyxF&i8?}Q%%rAiucldHQZ-bJz1$3n4FdmfuhZOL61KHQ*|t(&22 zl7+eC37k&tS*0CrW*GV^N@@0AI3h#AA(r?u?pc@yKM!%Mwu8ualXkf4WC*>$ZuoIy zM~?B)MqjE?tg3DDl_T1zCF$YjXJ%{DR?e;Wv9*Nw)4z9}Th&_isr>0pB=1A%Ztmql zWC(JI7=MwO+I>e@$`>ZSWVdm0gQ;Ri$~s4U z#oqiM+zAOb$CD%?lK>*qTg6n98;o8$j0yJa&|_`G?8d0@&imocpx(V?6E3$dVsPN6 z|9=CEyXus0Y`(Ey@Pa>zY>{L3MF%kJCq&K~N>a3ZUByI~rISj5iiVUHsrbghxxKKf^=oZo~Y<+)nJ}*1@h%40tW_2VX5} zf`@6$gvI#kb6UUUs@2<1$75(&b^>D}Y-CA?Bxr;kh)+Gl%ZZ%w36fMK$XVgx;_fa~ zxjDG~RS-FZ3=Cq?ynpe8I6^)HIT*z{K1sF09*<-{jAD=s;nSJ#-DIS0>SmO@F9Wp^ zGSH2J^D2Dm0@pP1-jXMZ&MrcBZpo*}!O|w>p&&Q1SE&KgFn-SES(?a^_w<#{)C9(mPM?qDUymy0?~t*s^uazFE<*L-uVj!l^i6vg zBfdf!hoy1kB+L;RJyzLo2NmYM2aAf9L$S=)f03G{lSRNjkT6nn!X`O|bL2Nq1gt9L0(W}^XsyZzvyK2I^<)svO~ESiA3{?{`iMKN~veZ zr@W3-Lg6-bmE%6EXC9lv%fs`t6y{8Hcb&|_)L$bt^G9DpSB~9Bq4cW=GA{OnV(Tb3 z9)3buXQ*X!xW;Wqnm?h+%ecvQ#^uj$57}8gy*AxG;~DYQRa4Zy|D*N(&fU0z@f^#@ zhR*Gs=H=Y?n$UHcTr4WjW+4vnxU{cdV)Wg|z5};UPji|--p&fKJ`$*hIlYJ*iF%k5`2uC( zrLuPEcOP@yL3qYlr?&_LCKe0Ex7h>H%vBfH2D)PBn0p*|+REvxN3q9s^SO0d+CRN; zf`8lP9|kP(2bQ=?up4^OfOF=m0(1a0m*|o9*!FGBn~ui!N=2axx!WlLV|!c4i9gBw zogbsO6XSMpQXzNaZ?-$h$Mdz#nLe~LH33$Dd5+fOQS3=1wudc^mzvuB@Dc*b@!c1kH9W&6^9S7Z>+y>Ea%7t<#RMPI z@-r#;k@&cC>vOu|hg2EDm(hW-9U<{&E{@uI4}$m(+8J(+cFTrUd=RqSFUG~G!cb(E z@;G+ATSQCs;2G^g4?efh#c?~qfBjEByO|-mvRL&`_5U(z>SQ;*7=a+G>=b>wcYiIxKc5w65CJ|&8l2k?ck%Oi?}%bB>u`HX6yB6yxtWS?)f3hTiXDC&WcC< zW0BZ9CfpI@ZCDVCViUGkAvUnX{-Y#V(?NbC(7NQ6Jm>~)gv6L!^>;F^rt%swvFD}t zOx}FfJfp9rneUtQW@;;xdS(a(sO1qRYu^_d%uQz_=FHm+u8eG6aw&^?7z>@-8A7`N z#L~C*-%LumU=1)Z7bHRfXBQ&GcE{w(hITac)$KF@d7LC5$s^7?Eg(aocv^=W6?x0~ zH=?L_oz04J@goz?a@74`1f|vDR~HQ&Tty?Vxni4{w?0;u8G|iET7ib>n3nBJE@ciF zf$^SCrr7+mzT(kmmHbIt8407%FeMmUPxDymxtcRoM)wvSCX8R{*&wocGE5x)$OAtZWPgS;DC)#fb_>I?QuQm60Oe zqVrkfi3Va^Tuexz4gwXXAd0P^S|N}vTL0k<=hIVOt0&gb-Rk`DtjGv^D8W?JV-YL% zBLL-2ge+;wjE{0g_*z<&95W5CE=GcUOCn{CzBF#ut^q2;MOVnFHeFbRMCKY;D5`~l zFc=sF@wT`-(Z_G5H5b@UDxhRNcOzGZ8?=4VQc(yjdG}^rzKgf>HPCEZ^(?tQQoYh% z$TswHQLY60T;-w-2kJSA^XOgRobxvcN>xO04W2PdN`=J)AXgO6v+q;o1zt<*>HAwO z!Ja#DaxRjIx`xc~vIK(bIa7#^%kJs%+c`K9Ee~@U17(m_%*j{oM!EN9G&%30bHIs1 zaU&Zl#f*WIumzDTu74#kEFG_LRuL9U*~Iw8@(kz8zq@8KiujR*aS7=gMFWGnm$r9H z??}Nz0_PgDm1-E_C*Mu<_7D|lg-@9wt^0w5}>6>!RhACSOenUU7k>T{0hLnEs@fO%E3Fdl%SlV z>&&Q*zKsG#-6RsFm4Hw88NRjMS1sxSSb#eV#a)-v$yJXSs-TKPs*N5!eS2*0OX=vd)(;%`!K<& zJlEx0;?qsH7Gmql(XU;tk1Kf{_<)}0xNN!+~~kUJ}~p`U4-rW zLKsUzM!rXP{W-znzw}d}ZIFu^sipD(1lNG;867z-SFxk}WiX#;D{XmV+@3kPlfA5$ zK?_ir+(1el-j&qLHqUE_BI0bkJed#@Y$rrx*nU3JK+ewSP<$`9L|KtQ=l_JlZLlFxb#v&lU3>7B@vu;3V$ zIV9<&{F`n*_B`6@xdk47v|=07@!V1hWPHrnB_|Z(gbl4Z4h4zUn8nw|ai*nXxjq$kCwbZ4Lpy>e**Gu~WOT`H&Ql|@Ho}8gO0TsPiXi4d@0{M{co?B`bwb0@(zsM$ z{79NSlTsbaAh7NDi~9Jx-A|l8f}*8qoltrqr49ZK(JX(iiyRMYuuZv(GaZ7wr#pqi zwqle5iG%nD+it75$OJBlr&DQn{Vg5k4?sO@?iJf%D=dH*7klQN`nExPyuSks>rQ-0 zw78I#gG|nhm86glx!k?Px1Wb2-q~r`yLI(ytJ2zSze{nt(Xl{8RJ)K2#Hhq0@mC%` zw=Net8ag*W*S|_j5J`toMKLij8lI}2ewT(tjK|%YS*oOb2eJ}_5>Y{T*Z;n@WErXIJuPIoB#cCf_H*Rg-NE;> zKq?~*rmG$nx+tks4gU^fj1-89uwXATj7ho6cSzOmzz)t5iLHs2d>Vv+2nYieoiV{) z8BI;=ptf`os0LL?9MmLEAtY#~8q6{EO&KUg&a}=(q#=wXAZ8_9f?;*1*f~jjRVSql z!^RdAhw*{X)FOFCMtRv;Zn-00xri17l1E>&z+0RBv_O9xi!QhTGF0WI)N)S)WuzD& z<%;n~m(avxt=B#mjL^ZqT*f3gX~<48yfFLRuE&eymUOflEiV1S0c^=IIh1{)4Cz3A z`Qs+ZayF9qDAXD57tDi;PcoJkTmgp>5E~3`|30Hx9CE z*8~keab4ZGbb2L1dPoETds-;?%F1&+2vFe^T&up?tf16Kz&9Xie)6wDb}u@dab1S4 zM8p|=^~I@dF!TbSL?H!8hgKw$tI9n&C1tQ5#l-^o1$ms~ds`}j)WqCtHKJ;}FZPnv z9TbP8firoo?f7dt?@&m{b*Q9?9iKx&Du)JuI^g{%riYq2xOH|j3zJ%o3{P->;9d1I zYsF8sMl$W0K*R$?=XsVGT#M@r&^3^w3)kTS@;H8J&Mnm1W(A+_6)bqLy z@)TsE+$T^>o*5Vt;MsCb$q?g#Qj64T{eJpfL15CYvC4}CK~TXRk#ZOOC(~f*QXbBr zx3gB5aAP8zyi^YwzA|brnBj{o6Z%q(bn>UC3r$==1oaNQmeHV+0tL^9p>nt?A&+#o zW+=dz&<~03P+No$6Vi%-$O%E>k~hYsXWXh``vD@rf@tzDKHOsj*Q+8}_zdZ0N3%Et z|ImuTBfCw|Z3luV$t+2;k~=BkMWs$-t8CF!hww|vW|;^vva68h@)8H2f}EG;-u@Lc zQ$Ox$>Dbr!>AU#4bde_Dn80fV#+zP%A~o`_<3j)EQ#0jJUg-3jSO4Fqf)ViL1=i`; zHA!TN@d(u*gc4BVa$f1yX{S!LLOh??j*Kv29#D)OpMK`Dgd?r#FGo zTOBd7$rdv0bmpRPoeqM5Pix*P^-(cA(Z@d0hIi2N#fl+M3fMCu*#QcP7EPVnqCWLx z3G4^$L`5?zLP2PQ50sGi9kZW$lXSb1ya>Ypp(WQehT){;a?1gN)g177r?cHrhW^@d zdPZdzc1Hi5)&DFT`akGi?>dY|$A7-EoF!wXo#Sazbl%ozLl_2Y8|;%C|G05n_V+z}yL}($y@Ed(w+H^k zAM*V3?~na1BgLy9hri?*9^%kA?jF_O9fxK=aGW6jR-j~DT8nXp-$DQgE>ypF~3SyiFn{`CuQX;uiv`zZZfirdmf(mM!bRL;P`F~ zJbs+}4()Yua+QzJj~lDRd&aliRaJs*2_$5m*k4CNpXB$&Y#! zMkmE3Y${llzq+FSAWn8SR*C}6y?qx~rY8?}cppt-^h0GzO$#lXo@fkLp(K&16)0?b zBDx=ZZdjEDfNN_j3+QRkn6xzzollxN9r#|{7?v*oX2XAP;C**a#)J3D!0_K6dSvCB zSjN8Yx8caSSJN19N;0C+kW5p?^}63!R1%eR&14ZS9YO=0xjs|N(I+eL+KZ^i!sOs+@V>jo%B;uDW7N_lii$2!3uAN>;baSP zsnwD&v5e45_Tk9)?%8+~89{VPKPUMUi0cSGflG*@5DW|oX0PbtIx%tbv9CXfN27et zO}JVKy_8GG8dBRRg18>xK@ck-8?^EsSGP<#P|+A>GclYfg8gQNV4Z-;Jq3w%CVoKnnNjZuiE4l2YgE_}}AryviLgIb)% zc&n*8Qj0J~m)<^`Y^Gi+D462)4usD)&5FrlUI8>{hFq9>28ab&dqt%_=f=^SIDEd` z3@`KuGY}PT<76(tBq(%?DM?boE2d}Nd0f`!vWw>lZEaMeM{{ERHKt44c+Q4tk#?xk z*&p+KJYBaf#MC3Fj@T|r$dHGlmgD_KQaN`xQS984dE}nlyDhL9@3UD0bR@<+fVL2? zbd)Hf#p&|gt6qUfjmk7n21JtT+@UH#atimehM7Xu;AK|PBxeC7IyyEN;~*ctv+twj z3v>bL5(1_IV?CmH^{Fy}LxId8^>|~%%*7JQ&sSB0Fe6P-!({kiYbC%2MYHrxc`rhm zYTGQnBgc1!&nJI3k&8fcq)7q3iV&rblKNT2+x4nXbm=-5vYm$ubx;_tk(e9RtG7c) zvQwuaA2CHPUSsp?o*j;0*3V6KC?zPksK{Hn?4Fowv`OT)XskQhmA{^`*24ndoi9N7 zA(?pweduPtZU{JMq}|Hm;TsIv)DhV}G1;)p2k+tevH>02`24(E&gGB`F;g>>D(kds zi`%Hlx(wF}Q*h>4xS6?dm#@v?QL}E%PGx31^lFtn^{8`;f{=J zUV{?KT;a1ttOMSP=+7_49>$aj z&)54V^3d*iD^bH$>dR|qL7Gpu1*zw=m}hI_{OvQBjoh6+!=D?;<;%%u<0`xCt(*&$ zW{W7k%KGjNIiEu~eU>RM6-o~m<8z%;-&}m|ZZWq(Yb&dDlB`M=Rft|hPrX;nTi!Ugaw^KlL zFP{+42wIsU+jp>&&AvPC#&ZObi?PVklk!dh%;r?p;6sg`%t;XynvD_KcIewXuVdrp z<{wQcz(Y@;bBwJN2gmj;)TMUOv}$|T&)U**4$(pzf5*PLlt?O*%GM(wCV=pFi) zTt#xn@jHmq1mzx)e8wC9;+@eqTacOI&%i^?%w2~yf(qtzHNJICUa0+f>)(T;qy2iW z3g#(`qafV_W%w-^M7sU7SRHJhA_3%u3Vdl9V~aO*$~2Up)6gPP(%69$5H(nYOeS224Wl-uhFR;_d1N8Z&ZE9gfqYF6 zUrkQ)j^s80*>>qqHp=v^>Aj)4;~D?raPC6vY33qXq&~2q3F*RQHVP4Q`tj={e>*>o zFU{TTHV!*x9N=Ah%JtY5yA(UsM4C7Tddrk%Z+!=6pRrHzxU3e>5+NQL`LPQIi0~f0 zqfUs&n`6k~6`U(N4#%ra@DOs#T*K~K-LaSb%~rod4A03omYy5Y!?fWhv>f`$>vo6c zT$VP-j3F=K^m*8zpsNKLhEhvKdKwgM!Bfm7@9X9Xec4d`B%qmApKp9`(?89)B^{c% z4`%b9ay`SigyHcbk6rwo|H2z_hW%k1Be13M{;|t)3 z{zi_rU;eTycYNvwNvYC#^SGVN6y-%R6X{h7iJQN;jA{76z zZ-G3hmr()c%2xnkzw7{VWFzsjt^YqUhHq!x?=%0s@1N!sF^+X}F$?n+-Kz!Xb!SGA z*Ga1B*UzNc=S{W0pMH1`kZgbp;sZhF7O zzt8IVYBXzn;Wf5sk1@Tapzs?nsS8+G!8L>}N0d+D?3nnc4=+z@#l8Rfs!Lp~REky1 zXrkvMq+SC_7$7a17)n{HyV+89VY!^&yfHXM{H^`j(YmR*_z7B>ivx=4BH%G6S!s$- z@G1|jZMf&^~_ISFjp(S z)kg^L#FUvM`h9L%FU7RlL}bMYF|NK7Y|;UK@go_Jy^*A*R2j%wm5cP=6gG&}8*SOd z4!mqI0EOMhiKUiz4&KG7?_hF;9udl#zu0P>QOWcKcEu`pI^1g!qg_pRjmllAlzEIsRSadN50UPijb64hqcn0Z>uTb4#hHuO6DJq`fi4B&-&Ln^_w^|xQ-({!Bdi`=iS3HTf`q^(?$-(6F8sfqCsoCEk-uZ^QgnO z@;aOp)eNQM)_iAPU4D6hm2%!fNZ@4P2*nu(j;dGFUcqQ{^De$Jud$}l4|9W6>T!!| z*k>IeHtDea7(;jMWOs`&q`(gTfdiov_gKoMc{NLoTY76>WQ#i~)Rv86&SzgdH$s74;1oiSoLG5ktK-+8`D!dYeQ^2a4&iK6>=t? z_;34D_dM%(opQ>^j-pulyAc~11|WLLj+)5tiH)DGOSuKPyz3?HS1nsUyE_NJ03Y|k zR@dirSODY``Z4l#>7bMVFkW+^#K;7X8O*O{HJ+)N9?4H#;BNo;q6|hcIBTo42j&fX0JG4$h#x10m)tJJq)5HFHt^b^j*}mIA z|5kRL?$nW{GzE(iE?Y|^ARY>;cR4Zl;LQ_R2Y0l7X8M;qW~L(&G%e;hFxrdI(N%0G zAt|PjlcpwUb~)J6?wJ*%0`*BMF@L0YV!x)DasUSEARC(;_kn)S^|zo;;5Df~`vhpq z%a_jRC`CLVkR$@ap^^yUVFSgYljhFq!*k=iY8?gUEOiz0>(meHoyAZ%#~!&sggh~F z0ia9Gb+(UedZbd}B?b_zLl{OO z_vZu-0ySEB{l9kPwR4xK6wAE~L<7VqLYRz_pkbctjIe*S*4;gK7xss=bL$IkN6mlo zYT02%0Dph;_b92Z%C&x~M~QvorthSpF(QVVAR}UdwIC!}$*LN%JonungxsNyb7Wpz zBY5N<$i0o)F>RLrgW_L;8Af*SUg9~Hz1O)lX0uhdztsyZ8iNpBPNnG>RL5ML0fTU( zpr9$LwXqGZsnf16%MYPr(DUVAwuQF5R+zQgb9)Wu_DKe*@X(2cYD+pL3G=m}jM6zS z6V;eQn@US0sEX2(>5AmW9^uUNF*S< z;}3!2iM?lJRRG9^?TDMhTXvXXJMUv8Aa??p|~#(Q28}ae+`&<7R4k%I+|q_Y~;` zbi2=`q(JS@YmkVX{-!PfWRgdr(l&C4{nn{!?0H$28uyT5fons9t|YubR@{=RnmgOc+O=F z{O0s(W9KhlOwxn3wR5DbD{8Dv@B>p+a~lTwG2fYt-m3eT_FcB$><+nufYix>zzP?X zOcAane7q+<>*I!c6gTNy%siDZHi`QCSJ4-F%|E50f+h7A8)$0|xOiEjVyW z&EXD`Qio_xxc!NArmgz{ZPND9ge5Q)jZVpAL>c*g@x*0PZX;oT&+mO?lAiun{>ptD z6@vZo>!9PvmTRfSfI`M5SY=ge&k&B8Vt8jmyGn0RB11xs4MWvJWJyf5L3!<<6H`_e zJnXch_5>2FuI-BNV~Zz8lIlSg8(OGJ5aQs8AqAh-#Ro{hrqMIU-p_8G)END;ms$#n zl+ihVClRf(1@D=uLY4W~$u$uVr`P|kr$ zTZ2o>dZzUJdK~-J4=7nbO5POZ{*zfx(z*WGpKO~`gjSTRsuVSpKE*HsyWbFbScYcwYI zdpo`p^(nGsQ=Qdg(k#g>s|4d@a}pMIn<{Nu-fm;nk{l(NSQ9KrU|*Q=;2;SNfjKnl zXQXe>?ZB~58zG<4gfkG<)S?qgve3@e2CxjPRBlsVkMr3~x3(dJ@+}%1NPEmt6IxoB zOZfr^N!p4t{o2j4Rc2@9;bLv}i|7!8PPJaAug`9@ok-IW zI1vVSkc*v%NtxWjB^MEhrHgKtb`5A7QMsffK&_~xgqoOvV*6A`PTZL z101ccoy<7iS}Xz~kWnzkC|*MXff-^_%r;xv=eCYx8j@Zn;N+4sUEc5VKlqofGP85~E-Lw-0N=G0>7OAYwEm*&^#fc=CR{ zUm{#C3Ey5Iv*nn+O9sZEfs23%0#zm&PuR0s&;T6kY3t>d*0p-u_qASwoxP;;p9@0e zLTMqAv?;ep$Dyh1Hizm<+vdFqGQ$?UAtEd|bg^uTn2Ht_}A zIwsTRSzAreY-Vzih}DO_?9 z4S@ruCBjG}Lth*2JQbNq<)D$RT zECv(?Pw*+7JQD+F-Tj6Vu`1DSm}~&lPsf?eQ<~%adf@%rAylHUO--?! zDD`(5pGsIY7Ki{=KuYFwOvs*op0t0J$6_j>!)gm?Tn1G;4a$%d>U8m1BDANJ|EvF* zq|vu_c{@p@GtiNUXkXQnBI6VeI#>uj&vcoU#$PIy)Y(s}v+^oTjqsZHr+EjlIyXCB z>eckgmz2BX+57)~9v6QxY)kXSD<%tMEJnt6QJDBz(cq;L%@J~dWX);x&1uD5jvWU{ z4;cc+vZi=g2)vMp>Z^ozF|ICX#CH9Mf;4POzk+cb_M=^pq)HQdL`cyB=8aid7!Ka+ z(5_DSL{BN0JH=xzq%|;u=4&fhYG}6D)&Ek_>9*z28#1NFjDoRKXXLPKP3T(nJs4Hu zAf0_Qz8UkxA59+6#9owslv7vLrXm^33N?NT$E%b;pU{X0UfL^pkt+o4iaeM zsak=e&;sQGp-odiUtUH4C=d_=00aOtLj*toKyPKQlwtq}pdwa#ukZd{Xk%C-lS^62 zB$;_lBSQeYx2d%`N+cm$X@9@+-vEL$0!2gsU|;~+4(td zn9)yu_?^jSLs0D3UW(ACTC2=wYnE^#eCvFg^`n- z*mvG*tvjc==-IDWr`kMjg4mPR={gu`nzp^EOQ5uWv}Aq%IKb!VlC_H?_;e( zDW^@xY10m1%ON5=&Y%OK5yjTYcQ?9hGWu>kba-Gd-<;VLuj*6Sr(CV zJ_;GtMJU_AuAtLuC$Me$8RSZQePYdUuz=aA2e~rn^*mij-`uj-v^JNd9y%-OqvX0$ zgX@kaUCP;I#Zt{9Ptecp>EdEm=smqZfx6+1{{Qm^!1m`K-*55sQ00$rCyUOA8skiP zPjUHR*LE#{1ygH>{;oN9ehDGwX$%LU-O1hj;270xTRO+L;{o!{sjU`U_NvidJQ^F_Qby?vhw z;JjK&%{pkGQeC@Q4ZR09sip4N@VqCobKvbQ(pXAhFX_ZW_d*O#Nx`&DzW1z{XwEcY zL+|*J1}bWl5!9+KTm z+Q6R6HUQc<+2CC*(#%4K7itCLxlFp_+o*;18w<`pNI{r~oxICM8g8y?tFH4%z%+$m zM=JZHGIizY7R`8(P6lslk?WtP7>y4>zyckp`ZiTM5+f^?x!l6&7AG6LF-02dr(#bI zi!nM1#(s><41$>1LnZSMJ9t}*G@V@SSYVrpm=?BxjkipOPLVcFl-Ic3Fha6}ceO~H zNQ@yiC{7m|mp5Z<;Ot38#)UK3*(aO4QAHZxtTKEEP)0Ghm}hrC{O84_h^et~iT1I7 zaSh(qB1toVwr^rbPt;xYk(l{ra_Xzukhd`9=lygR%$`Bdz11gw-Q#Jh*-1&l@ioF* z=J{X_vef%pb&_BWO0*EKk7b=->D4ZIv;#K>LRQvf@o%wS1(E6%gpFZs_mzh(ys5pN zM7K$+bi@>X{f3F&7(MKREqnvQ7QExVF14)PlsVn0qtc+=5t$x1sOm%ShUndYSi(En z>jZ-ktaz$}D#&)gu-HjAc{gcb^FDbVHt@#wx>K?+0jR&(SB(iBbsy@v^<2-x{jKkm$$XC$Gt1mcdY-;Y3uDPlFDN3Iokw0;BoMvthbLy;ygs9 z0}p4;JZ3Hu=7YV=w^y75cIiGdfvd-TaDl@xcX!zbS0$R;g$2T{<*07J76iAL(X;#4 ztoZHnu+^ntFP$-w=m-y%7yh|X!8)$Cu-Hh$@@dxcg3$$6I9L@z-Bk8DW8HaotD76% z&TS~4UtbwjhZxB)luUtwT6vi9+x#MQHti)p1(JbF>Degt$ayIpnU5ZtJ8OUM*EKnR z7>RUI!Nip&kL;EKW>mo$95(kA?|+Fngim{euDLOBdl2ex;*%5`1NWQ<>x$m)q9Yd$ z;nyBlCr1#ldysXyPbi6YQ|(EhPNANb-4{3esK<0YapSh6`+_ac-LLeH6=*b{tVRbt zv`q}HqdzyzfUq&PJBf1h-8?)?G{a>IF$_th@drLjVO)Hx>nwpVhFt9XLSMLq4~uEX zRH*^gl(4B7Ti4->4^(}qWxQ(6+7Q_zJX%cn%~b)yjlp$ManW911W#paoy}Xt(-&Du7XS$Jd+&AJb{3G`|{k76HESdOj5hHPrV9 zR=Pc3bt+=~ad+;UQ|Hn9FMX&h^7Nh2n{?=&v5s}X!yHcT1Y5|0>$`A6fU4^3EaTv5 z_$;L!M%Z8W_&xSgcVq9CP2tPsafDCKP%`j?TWhz%1?TIPLWSE{=l@b)ZR{s+e>Z}` zB3~WAQkv|xy33o$Qfh6hVbWWH$4P))WXB0|K96)xTSA9E4&9= z`g!BOx~C4rqOalHc2n$$zuqV)&g_772s?G2VSM4@TWy^sOMIWzu>}5s>o^X^^J>Qo zjk{))ML+EE9kx!BvV)JYTzI7dr@BK*m@(WY|BE{7z#E2y8{cZ{6ai{#!yn1vG@jAh z-bZxfN_t}K<9As-!Lf%azSh=vM5qI^M-7s^gkL~mh%Io=w_g%UXZOPt-)rluk8s_= z*YUNa^~2vy(=c7Gf8r`|>Q3&r_lWAFR55Nnxqe zvwZ)D7$SSR;cjbx{~wHRE!Cg{;S49E;4ARDM|TsvqP+8;{-(TfWWTa|@8$iCSHaG6 zqwQY_ifp=s2s^l7mW5bQ;GMnG-4ffI2TvpB4eUcxY~mSLlUyS>xa^-Zj@wo za>k3B;~DRArvINQAT6|b;5TI(@Pfad#w$zr-gPg>)8Ne;>7U}X~)Gl+{b8TWyTNK zjFIASHripf7dNiL;N4aQ!|-PAHpkt2hAjLFX@fA!@oZf8nr7RDwx{(AgY}o;|A1qo zL~Pnl@HlqIr|jqGmilay+0YiXzZG%~#%6R~E7*-}S4={{Z&R+p>sKU@9^`E5b2 zhPv#ex4j6~&+r2PfWx&p826@w5>yCs<me97bnpspcZFU+pDe(9pNRM-qyc=R?#L& zj*C)ls}UtqXqdB|Nf>vh=t=f$bj zu`EV|2~(cQav-q{yWytfx`DEqj)C{Jn%;P_*hz~~$as;?8kH@r04cM&J>yGd=6`NP z={GWA43AP#rp0C|l}nMyksBwPByPSpcbD|IVVRGQs<_ zQi1yuu#<5D^;$Eqkr^LSgl8~SZtyl1hE=cV$ZAY;1e8-G-#A7uWK^QHVZJrNH2u$B z?2dh>upAjlp#VPhq$YJ*lVu%nb95a2mzfaMu>q+Gt4X0&Tsc&Yl;8zNrZsS1)2`gX zedzmY9S{^nW%bHRf*C9Vm{nV4kfLmGryqZ+G4^CDG&M?V91aH&sx@Vs4Vs|vYx9B# zYKX$C_O=og&8wWP5CBp@t-ml*A$`6${L;H1zFO2WA1t&gLK$3rlE?ziQ6b4Fi*$Sg z|LlnU@V|kGwCV*V$v9Rk(Xcy^@2Qgq%t_LrRK(cT+A8(Bf^7PRskvlJBalTZf<))u z^n|R<;zzx;1P~0FE?!lX*bqkp2!u-Ys@W4+q)f@PJ+WW{pbyasQdrHmc+Z^7SL&x# zvIpMi7$fcD|rHs9lGfiEo=Q{<6jpX zSAIY06PKBV!vFR|PcZNEQD*|F(4wd2lNYAZk}cDj*ic#AkET2SwP)9Vac9;Z(7)hp zE63`!z^NvX(27iSLk2fD97$K5c1{1UV(s|J-F`U$b>5#khq3wh;jdiP9i@&*n2Vx@ zZBx<@Evb_jZ6!n5xQ{%@Y=3A2+ccC(RU?#GCfP*3)I#68NK%p(yE8y{n>)R~;lXva zoe-55=3;}Hn2glrU{o(C4uLz8-hjNd67vYqCX3Vm^XmyW;G5CLnAF2*bLGuzyZn1n z?{#W#^o#W;^yk80bjw;W zxwHP6Ctv+0FUh#~6k}a@PKMEvQADe<$(r8IC(xtmA~%`i(#J*l16q+FT@9UC$sDR4 zx|H7S#N(Heq6y7|FTwzD8?8tCP8cW={5ocCK6+0kKO>jdnJ>th^2_+|Y&3KcsTDpp z$s{kj!Ww!HS~Y#(oUGoQ$-vdkZ}C3(d(t{woey$d2@pumtCi~)t2)wjA&ALhW@iecsZSoT~t2!d#2vJRwmKNy96fzB{q#L}Pr=2W{q0xp2?0qN^>BS`|pS|@bEEf_KB*3OkozkKTdWu?&)(8g=OwJ;un{v~% z&x4gC$i`>ZBmJ4}12$e{YiFqelOQaXUu?c6ZmC^aKx}C$_p9Z-`Dajn_D`~zEO)Rr zk&cQeniEtduSfxcX;lXem(GFn@t>@Aq&gTK#2G!Mut4b~LPaftT7-S4=3(ykIV7%} zS5~6W_Fo&5BJ5~XsWh@#(F)7e!mKqou>#7f zd^&BeHKy$zdJtaf=N7Y7C6pT%Ng_5UsQ*rmZbnvqUPemQ36s_-lZ+E&G4Z@g43Qw9 z^wIo_ZKO;!v;uv6gUl3C+o=Rj$R>@}8&~_U+6Sc2VS;P`v}7X*l@5ssLdsSQYYUEQ zZQVhLoU_49+C^f8SpxwXTPc#D>}6+rVP+Yw|5+Ak>h=c!>@k@db4p2i*NpP+QS0kY zQi`nqrY%POd~>Xko^*3bXRFdk7ZFNSBi~ok%*4;lbnlJvb#url$_QBp%{*{g&`M&# z+;aC^_$wa1HPtK2ccx zMqi?vnBkbbdN3?jMKJi(6sFbmk(d6<4>0dpBYJ3?kmCIaeD$$v@A@^5gTez4E`RZX@wOrh9e9Uwm9W0UwfE%SQ znFt6*GCEop{g>?@f0|X+f%>e9%4P^DLA8~}(k4TX6d9R>Txy)$E{?*>boN?<-Z+$6 z6M$|S!JXlHsv0OE#^28-Ghj9v)@7WEu-;B8tbk~YFtZ+FzLa-Y$+r2~lY}qQR)~~L z`dm^)b$5-2_>Skc+|=@hREiut%@O&uB1jbu8*NN{MT<^J-Ahr zLY-_(QjN>D9c!o`_>#$n<(Jzx((i(k$~H|MWAF5sLbxR(jTAQ5P~X43Ww?O#5lus3 zAyFi1KvHwH_hv@4r2Khj-g(Z}BUhP?n*9AH#X&I{BYQvJgf7w(7bm3=*IJJYUQOP| zr3zNPZ^r&_1DuQ2>L!B}=tM^N2Pqmtesc#3SG^hqL5*dzleMaRhGY_r2zBfYl9rvj z3!)7)oUrcAGFDh&HW`C)SdD}FD{Z)Q2;JKw)(6U{wHOHy0f9<*P$#Wpxhoyo#G=rZ zp{A3Q1mPPhSWVm4Bc17;#Xd8dKJ&hy>Ro!fF)EPrwE#ke#ndvx6`TPpG?lHDU(RCF zTJ=oUSpbC2vf4RL>$J5yHSq*fB|W2ka)*G(P1G3~krd5dL0vS?lQ$5++gR_@@ww}W zQ0}^@I&ij9qV@fhgBaM{nueddL0mMtR-)x(MR1IcUyT56BZSFKJ$k0kj~c9EC>;Te z|H`PrTFjonCMp}Y^ZzG>SGs=xa^=4=l|#Lgvs{`sb&Tpns4^KWDg`{&Mh80;gY*C3 zRvs=!%Yn_w6WG0(=AaHbCauGupL=90R;6Z)7^ljMrMJTWJNLh`)UUuz$;rqZq!|EW zxcJ{zp(gp2%)mFg?zDPR6;8k=)(D!C;4~fSuVlrydc%Hh-16yfnP(c1kFiZDZ65>% z(-U;gqO2QZbJL-T=xk+58=oA+JmXC%{xFA|TDQeYTtlCdi=A)C4w zD?!$eGgukFwT+MB3VroLVv~W|5Cu$Pm}>fgrv~nx+VmzXoWN8MjE(ccXoY*NARj7ySrH#a+8O0e z(jqFHnJ(2x_^7>^ll6;{G!#!(TS)_zZR#k4q{us)laXjtWR=C@=+v2>F1|BYStDMK zL)f2-XTLi0gcCL+jt>a8qrWM2BpH*aqSW<3 zLh%`n!OV38vsY#F*qvDA7&P>3YjVl@dl=}O%>x@N0r5(X{J40`-Fd!r>oqYs6E-tp zP+ca@aW9h9!eRI}dcO2!{_wG3X1zhxK1hO$8jN@^(n;1gi!-6-S_ghkF*DW7v+=h$ z?W}CRK9sbzsD6>C7Za{V%4s;=pg2JfoUX83IA-$R^YZvLYU3yWeLpv|ibsfpLrzUc z7>pGvP*(`0S?aiWTmEGyo0_pIhVh__sZOcXc(6^ zS(Wdx34#1|?)tj&>D(b7BD~b&Auu*pgFbD9gx*rX3k%!J|62dhrDi?rv|%#d#0QOn zgQ&!nd;61`1$|1I>fB6yV8%IaEWTxhBuVEWT^R)h2b0`LH;$JRbN`F%#7enz1_;klb--t6Uzm`i#wph`20T?mk}q8?Uo{S5v- zd3rt>XHHoH{%1%ke9xiN)JU+-J%BjRE3)$M9mRoebPMM5N9^IhAOmA851Y(pIiF3q z3YweQ%HlLc=d+P`i3i_*J{b&t(=rShZ0m(a=V;^gZRd9wT#VuWz6}@2QU2{ddD{@3 zMIe;YBi^)DkeGB!Hz`UX9i#p&8($|YLoes)Te<)1;_y!->3KP-kp@kkxf?X1&g+N;A1U7Kexpx5-XCw)+*Phvnv{z$IhiR%ia{pKNzJGmD$PAJ zEWRxu|&<^Qr_qTt(yAsC?#;e>L!=&Q?!}Quy!%mY`I`X1 z5D)?Y0{}Bb1TX+_Z*?!~W&j7EXqfM}?tEAbSr&C;l5N}4)+9x+yE}8gDRG4*YnFR$ z|Nan^833Z0Fe3s0Xn-4m5U5CPm=P!Z2`|FaUUjMi&IE$2VtevHgf>F*EH??RJjdGy zt5U`O{sfHd+72wxv^H!UJWjYeovs>4T76De53aUPw6?MAeVRqKY^R11k?L&WP;LNe z2rmFY1^{Me0F1#3x^|@7YM0v6ukG4hyY+ExX=SW94uBUjEJv1+thmWmcHeH@jaDW> z0n*j9JKdZw@jZiyzq|?)K5qAnTyny zW$C(gPdN(zHYH;R^%7O65p-#7H4bhmga;Qs{^aXNw@=F}jXukN z@bMYBC0WYJ;N)z4daR6G>py(q_`u+FT{^aye54`dNFflLde3IV`r6(KnJT%{o z(}`5)40?R&jJ_2)87}4sm4PWFgpx}ZCreuE4Hcv&nZ)O0d*%sUu`HT(u>#0t5w4xi zyE`WvJvPxWk*&GEjg88OvhbL>@>q*)%F0kCUZS*&I;Rr?gTYJ@9*e7<2_6Bc)USmO z@5awXhB6hWVx3IFHWF78P-8|V;>QDpBYp_VtFulZL{s-0wSm9=(04h9wu zMMg1qI%^-dkB@lfd0f49tZ&!4gHg}M>{lqgE2BcN%+i-9SSsaS@?!U;O+-ONw&@^w zniba*M>?<{F~S)8sW1#n*j4PrD22&71Rfe4ih?9F^Jrd58PXGLaiLwsw|Jf0WPPJd zab--r;+ncdJ-O1V6hH&Sl?2y36&#L*8w)TO7l&4LV}8XBf0v?oVUorYD5H9HAK*+_ zXR>3ZUSkJNhlL+dzoT&Oh58`-AtrLND2Xg;du+(m5+Wye!qo=WS1Bu@6X2>pXvb?Y zpl+HuIkEtH4QNe@eUC+vrKApQE=F}e7e^->6xdujAB>#MOuq6G z|77`O&cu#QC5vf{GB{2Xep0=(zCOn`*5!k-56=S&pN|BdQInMvULEQ2rSehTTF$20 zow-E^BL8H4{b?$#Y&!LE(06;2{(U;hPp7QXYeZse&h!R0E>2fHnG+kc#*);`H%X6b z{Imy5u2d0E7*}Yl;?-@0lk4UZ6HAIf00yDL6n0b**ha|6PYUYRBEsX(CuTO`7HrD#3I^xc!iMwN06JUm4{(~u`6CYq>*(Nu>4Wn;#1 z%;GNpcs#7Sb8ZGK9x2uxA8n+CUF{DY6#kWS2R7tb7k2 zl>=Jg_Au+3k~J_514p*hClQ`Y?95A_J8%1xs{3BppR4SGM6{ldE-b zF#r+GkKGc71Jpti6mKH$WDLVew9uT%yqt04u9M%@>h`#DoY*Y9u$d3}zqzk|DFUEP`3i(+u$PUJ zK5V2t_)z%Rd|Y*Td$=dXRn8fB;kLPuGxd9^IWg-nrHSUaxh67tk%_jNo?C))oF58d zROruiAw6ep1YdE>ikx!c8}Q-Vv?+Nk}!xN~c4taO8<7YE9hnAbyulw5d1j^ruI;~eQ_WlwxWQ^=C4OW5UT zh#u{mmqKQbl%f*nr|E5_iTW7rYgHtn61IKyxjmkcWOK1wa)o{8y|t$>x|C*2T-3w4 zq80r(zoT78DR7{4UstzolkHRw`cUnR(=%Xn^p&}?IGFnwy(N|V^wI8+eI-aWT5oH* z?9eN^smCz4f&B)SxH*k{&yuSa*1pb_bscqq^qJQSBfVE!wedgcALOL zeEKA7z6my)v%*)aGkNu-*p^$${|HY6fq^x#P_N~;L-vcVqbJ9enD%Rwi7u=`UaMXi zvQlB@`QVkK#mHNiXNX|2O5VFhz>A#6O`(@>m{HluZOzw}-!{Cav)t}XNQ=29jJo5* zxk3}#&v*JeH1&xXS6_vdGL4TfCjZ#D_!yiV^eUQK%~R`Ds_cpy#VX(-&EziwiOXBp z4&2FI&HdZ$Nt)?qpj@Lqy0k`XL9M|xDW^@QL5a)mOmYmIUY>L5)kZ9Nub#KL@mAPP zoq0^;$U0T(8Q>$S^SI=;=VZ8MF5GdoIxlaiEkaT4G1n6I+4YDcRf_V;+?*Or{uOIo z*NNG*sL55ua%No zhpd<0s&y3aC|&94^Kj(0zjb=G0xm5LEw($0ER#<@o?zhYIW0#_Vs{WMyH4UjvNo^u zjj`E-UT*G{U?p9p1n)_fJ2{TF?C4@1<82Laf^qNvZqI*b6>Olwa;)b?n;uQJ%?~L$ zpcrB8RCGpmd+%&D-DQPlrpRuom8pe`u|K9q_VOd!na|MxW^W;te;H4PHB`)h#3#+wbGH2aRy0lrA-yWS?cNxu~ zs3tHk$p+TfZjPSt=%&5xw9M|lHcZ!^ukdpXEWGvb=rdVif8R^(H#~=S}`dTfu6TBsSNng`By3-oPOh5KKz3_%UXZClJgPrR!)s`)UWHq_1bBDRHjaf)g^ORZ zlVLX`tIbGHqE6Wk%HSodZP32o^|LR+i0PwEY!T*EXA$IB(6Ac0NhtKC7wFQra4h12 zx&F}@&~(Q{zk9i|x|eNCx@S6bJjhZ2I!Cq|s@j&k%=PY>K$)mR z=%$~$10NEZRpO<|*#jS{a;q6@^n#?d{DH`+oHV>^rY;BFVwtvOs3w|tSSCWh5)7&H z3X@*qRIjjC7mvxZ7_{y-*SjzmTdK?FbYnW0%I036st4M!@ir>lVNwgBHp(XHZ96Tg zQ3GQ})iRbi65EWTWf@*z{sbo{a2Hz`u0D_nlGg`7?6jje*n=6Udymxg-N1r!4p}N)FbkUB}UUm9em(#ZC z_coi1`Yyr~DE0QEG#^3J%oV^a*84_5?2|`6doO9+S#<^gNnLN>TnRdMQu7DL(chaae2&Bu#cb%*~Hf+mdr>Is8qgn6=lQzc|T` z;E#~*&NcR}xx{VUxLXK1wtWScMJ2iXXgnI1MI1F#YsI_=vtL<>yg#O%M#fWrE*_KP zje{n!t4$vjs+UI}%rwm;-{K@GZ-a|Lx9Uh-uD$6Nhi$S077^6#KF=+#0^LBNU*dj@ z#}MLJ!Kf>ba0_P&U$BRwZfof$=un;)0x zq^l?0>vUv6&NbD&cgS7+kJss?TTb#_GW$(+!;5sCghrT`&?f%=wLtgx9OM7GAn(?JlCP)*bXrFC3}*bAsMZXc7ca zkJs^CFy|PV$#=W>9){2jWD6om*S{^Cv1W>^M{$$v|5XbfJB)YpGR!X)Ym|(?6ar~D z$=YM9CUCve-(52Zi|i&|-4BoZD0XD9C+8O*i4&ZcfGsuBejIcuF!MXHDCZMwK>O** zM2WNM@NK&ep|?>zw~ACRsJom0?fWE|Nv9`BW(V~K+#}9ZE+8tnXW@1mR^X|lQg@Qa zEUaZdZ*z^}Nmq1Aa?WUQu{Q5ryr-@2R$b=bue0`LY>*VbvGKTh@>mp|q}#4)HQpYR zAvC5>bBK+WOYN^h84xIZEAy&56n0Ff_ikQzq6X-mdqiQ4cie+M-iGm#U84Eqxg0!B zpWpHlKwWSbHI6p7!+sv7S;D(r%F5AQx#>+eI}aghob{b@On=b5+cPu07bxD&BfGWo zpkRWUuT$N;6_rB&^R>cjFLGw67Vw|pYJi+J(3i8;%iuTR3RJ6{-zm$WUd|v-h-kfI zQ!6{2M6$E`I!;vK>+U??habf!{wHn#T9|*x(nx-|gwBg%!LQOpI^u5ZjE1f0uF1nF4v`iRo z@AQR6`MH=VXzLh?S1fm(zpv-jV`Y98_4@9f?Swp(T%3m)EX=2RwRk|e+&ov*iV7w< zB=()(;Q1fz#Ls!hWKSYFG#5Y?*2sWxyQHh;`l}faX4Rg=0~N^wxAIFnsC>{L9G`2X%O4%MHSv7VoW-VVn<$n`6u=m=wSy( z!sv7~lK5t8HY^a4+&7}nm#hkInK{RHG`vlAOZ~^-Sro7Qf=5B$f7rG`SaP}fWmCO--%Q0C-ptZ>Hf?iXFB5S4&CHs7-E+^C zY3HR+tsKuQzVzCe`jh@J8RXS--M12dkgt<=(7mqBO}lNfzvsy_55ydfS^K3&7w3oR z^(T+P|L5nM6Z?Dh=Y!Dlejxh6#7d`b)K2~XVeG@aqIeTx&T;vfzK5!L9j&B4+es(v z0WNgAWD2i-hr4gnGo12reDnBkdyXsB0pGkYjwN5ahmuiVS)9EF!{0LAJDZDZL+YrH zoFBm8^LwWQ?$g?3McBm6Vz4(s(6WkQ8MixBb_3w4?E73#ln=jNG>V}(m}sKSe#y`SXb z9o4#?-B={=#aIlQmtSE7660&g(`B!7Jv{5e!Wg%!Nr}^KUeP_hjBw;Sx&wik{A2=X z6BD4d?eMyDPjW1b&~8V(9O<4lFF#Gz@!l7$T?Sg9@6o4I&&8*>DN3O$y<>2qFmv#F zmiX}dL&JAEPC|z9PLxLAKpO1T=!DS%ISC@Ozp>ADa&>qc(~B10LDnVOLP zl^Z~%ijCRtHZM)N!ZvKOAo=T zJi#&`65(9Gr<1B$)qnuctT+Xu&q8#w<6<3U154Jf$4}|U+B^LQ{V%!jC|v%g-&{o3 zF7T$nY9SI-xW#NCy8AE2r#3#B?tPY-etFbxd!HG~%EC7K{9dpA2)hyI;cn+N0}`9y zaV*Qz=h2%1?;zc9|3)$wjQNS4nMYgb{pr-t^s9>RqA zeox6S8;p+Lu z5};@$uLU5J$$OyAVIxjXFbC(cPgk&l#9MfP<-?vwvJTxGh^u-lB|6w5@T#f8enNW9 z*EL!%aRtw_JhmdYHU<%@`Koa)STl3MIBV|Z`}cEWt4&ImbJ;IXW;4Ps*D52$e6Pug z@8K=*B@n+UY572kT)gFCV}Bb5Zuem@iJDvFp*00*?@bb481>F2Xe%qLGI+6PK9Qvm z)OI9Q<7wNf)0M*gu3YYyfAGQz9X{%$8;;JkeC--infZoX%=@gcO+-@0*FW=osE@Hp zb(=IU5w`2(#O!mnGAjS1)lb@KwLt(hs<7Hy3khN9?0)`l55(;`Q{rzAvf$@i_V)S| z{okjq^g3z@)4ixg9+~2!QXPl)F*UQYWhVoM4eH?Az!bBI{Mxk~Yrv@lb7G@TScMWp zV}!sgl7nZZT(8$+rEA&96{rj*NGh^-LId$2h1DqlG03Wtg%nXxQ|VuNS|S z_Ztv;edFv0DfI52Ud2F`ouvR}G&H^{5>ZN!ngqw$2taz4NALT7UnrbaD42Rt)xuT* zg+N{t12nKkL3ne+AP$goL6x)TEUWZ*SNG66qpf;oT3(h&It~q7P)WIVYGeu(2zV;6 zThA;Qcl&?GGh14?b&uTs_g`~MIw(sz|H%%~%9|mlW!&(*+DWj-TN}`rF*viRtgG{I zZ|Dkfh23K4PtNI^8zY&$_5)H2@`g&i24Xa^g|3u1v9wt*Ef}$SppS0;acv^E(Si*p zk|C+}5^YCNY9Llon`$KnU@&Od$JbJadpM!rYFi8e0?@6fk~kRWiJBGkS zidvC{aVH^IiyVYnHlWmc4k%wX8IBp5(xE<%()XentEB;9I3rHqKtpk*#zb&D#&YN+ z_N=mI=s02RpV<8^Gui2^oLMGfvZ#!EtnWQ0tSZ5bY(<2Ac|Gq3ei(`bz@fiXlYICZ zx{W0CVJN3YhouYzp&X;Zn^y-G7-O!51Xgb6hxGdGjC&ZhG{c|)V+&TE^a5S#?5fA-g|41aTpA>2~a_&l3vOQ%oyk6XNw;pOTW-Htb*qT4j^$L z72HjgF{KXa9rs%?=MaBpbJKo}a2f6KI(_t88J%e4y4WRlQDsAz2*E32IV4((ejdT9 zcF~___Z}lB14s5*f zm>xa=^`NXkj49aC<3~SuUcn!D@A(Iw{o{N%13!&wqy-&)8+4bKr_UD;(Vc1hSaThB5r#EPCDVC~ z_gJuy9efz&c8KqY$F7@;O5@U{FXC!{25+pyafp^qq^kKs++exadE_Fht9;`d9|OX_ zTT_-6TX6bV*n?;e)ZP?4BC$NT3ldjcFWdZ{Ls%VaXA?7P$KC@P5O`TnwSxe<5#}+_ zR3ExAbF2Ed0v?z={qLWbquly5K~!KX1k9RhjAZi^0<{NR*#hhI3yxv^lYO;kMzk70 z$J8)6h-$RwVu>o!8Ds?xT%Ly;5kVtJuuqUc;IIo-$RV1_$mLYX@9*%lPjv_;kU|P~ZJjXHbq*N_2 zSVB0bg5=gSGw3<{oO#T^?&^Tx)ouz?7^T@|F2yvDUo~S!V)S+_d zp{yhK{hj=&!ROKH;-(d)msFo21eMJa7E%abVN|uPbr9oNDBV4apbb8aH%nd(DV_cY`Y48Jz z&TCE3=fZJjn%U#e-PuJ=s(Go(IDQ#vVL&*SapzQ^OOY5l zJY;qtrz}=$=QIA>MJ3!XPGW%w%&8fM5$J>p;}Hsbjb=7)yp6w{owTw`?siVeOKn&R zf#;(Zh$ISx7(#SFVkA^$0Q#KL?wS4eU<(3sI+`7ctOR3>@&=B9zNTUfMMG5IF9Bqn z@Fj>TtRebjdLmL%49xgVMCpqZa737*iXKvmvMZT23TNt)*WwTL7ZY zLXgrTFm!Q%lV>^{KXqRQ#!*}`6w(uq#7^zCJqA4tZd_I}XgBYZi?{n{mb@LJ8Egp9 z4}&QK#Z)8)2nHD>UX zZzhM{M~mH-#hv^2|G`-wzCB-A0tf${Ii0^fYkVI$`1iMgwP$?S=K{88dv|D;_AKAN z=Dc;k^-B2v{}#>Adv=v#BWY;Xq8Ok$2nHr00U8s_kPKNQiqrfw#@xDeAzN8YqyC4z z*f1SOV;4tyC-nGxXhWp(eieCc>5GEchQrO--A-Yiv zHkfHJ^&^!1IdOA<3yy|sEmM1&05nl>P1ki-?vat-T-P;JScHhoXE6+V33glO%3cnE zXmy3N>Cj$Cd!3N%@qe;*sfmt( zEha*Q1zGN$#yOa^I*FM^7DW%bQ3>Ra=K7^R4Jfh>gpk3A)d9l*Gz3wARh2}$O2(}r ziczTTxwCBQkWm@;gN3Kw#EA%cFjXUmG0X*$QC+4Zt%Jfy*`5pX!t-&9Z%n&FvmkxO#NXoa=jWjwHXNnpM z*(2ORIh6&!^%XPF^nCP(7pLQRHkLpcj5jc()}El8ywyp@@fdDFqdecgG>FrwyXg1u zywIjDFl;Wmf6Er9J=KA)S1(iA@ryS#W4t5elb&m^iXl6o2f+*yu(UDBQ`pEp{EV>* zUXLD|D#|W+|6d_>KxIbX`hLFnF?yrJ9lrh;^|UH<;@KRZ7@uNJ@P?m#!zQ1m=HD9;{c?Q7tcw-8){N4J|Fdv$IImW)DH8ItwA7s z4K)Q%<&lO_AapWDRNPTM@M&C8t$g!m57K4$$oWGFwi7D|2N47ylw+d+Ie;?P|gInD5T~<&>$59BFZIBO{hVraY{+F6!w#n)DNj2`Io26NYR^k zP@NuwsWv0+$QYy|EyWo^t@=OzOmpV;Kj|4<1cD0tbM6ZFOU0%I6`J z8fTK=NeqQ!F#&@RR7E2l)gjw<(yQU)ivAdFDg0z$*ntp1B6UJQkZPDi8;r)%Ew0@E z9McUZYiq!YLZ(OywKp;*rCzM2$*Zd3x>Ta*MJ*Slc29GYK zidZ2g^`JN-gU|{cn$*=J*~OC3C#_mZQo#liL2+Eh1P+i%Rp;)W^{B4=l_nCSHx3Aj zSXz;?dG$gbHUZ0lB_qR~o(|U56i&|R^p*%YagtM|!XXG+41%%(19Aui2m}KhfB^z1L4XGk5$zv9 z+=Tv;zOUc!?=j!E`4Qh7CL@F|PMz4ct-wP7ZrieV;$@-ykqha-#GdM z?OWvcymw1Vo#bEk%ZrowUzRTy^WWw%FM0Xp%e_~AeW5A$K>zMN`bhsBf;wg7^JIK^ ze}0cEIUeP4PyH_sk&|-V!yZA2=Yq+lsiUN=@MM8*kw|FTjDM+CubndsnrbxYnw2!k zIOjIRD%3iUi z*As;Yx0!Pa?4aq86cAeUs!oRCb*Xeph0{Glcwk)Ixy_hL9WNaq)K9A*GKWjuGn%eU z%p;uBPaS7{`RaL@(Omk=;|B8MlclQt5S4l2Q@0Q5_u-tGJK5-fzb3WRk`&h>F-ZrMb`vTiu(0+q)Q`OlW0b)jo!0Am6Mj>FjZ?Zj(;85fHW<4 zB+9cnoHiji80xfWXbKT)bJ>qMYvj~_i`sw|%$FW0HVV|61Qj%jWtv+TZ>D|nSq0qx zWuSaHHTlrVyXn#dsDqQ<^np6)sSkITsQ5?!pEYf15@LtELDLmyzOq)!Sy~W6U`(>M zSe9xP`;~$1Hx>>4B)dfwJ+X?UvYSq00ax_Hgm4I=Xj3k_)qsf$9Y;?5FjfBd#!#*3 z{=O%l-OBjZhidbu@_h%7j`TJMs#1E(4g8M(JFz@lDTT=3dbS7B;T zB=j3adNbhb)pMlrJ>!|RjRD1zG5h~^()Kv5_gCxRE2X(_T`U1!>uRsdF?uy~M)Cq= zdcD`FnYtA%l~~=-%sq_ z0ASUG^%R6blxpH!)g(1ml~H_G0?5wPJ<~_$Lkg^aic(Lr%SSD+tE(6r2r8$+T0C5j zn3QE7R=vE&o$5ZSWeM@{s`C7`(+B|Vn`P=<=EfY{1=qQz*36^8YSL0;wo|bO{RsBd zLTRXeZvCFoX2ZsGuy$V6$~I;%dt||w8r`U~h}J?iZPRf(^!NSD7u3aHm-b1c;F?qD zI`Q`52vEWiG7(gfcoeA7zK>jwMIWpj_P^Gqm+ui<`+v4xM}zgNg&Yul;Z zQa#x()%8VY#`p5e^3?3bQ z`Hz{eETxaptg!GNCcfG@V*oleFlJ7!hJLFDfQEn@WDQ=HwU+5{NH%%SS-9A`YuhxW zs-U$5Rx!xC=k;L1*T<=O&GGM?|97TTQf;DVmCyVx6M68+m3nl4@S>!?T_uS*yz;d% z75toCaq8o52QHh7u*_LCmol$1SRTTiHhu9f;)BG$y|VO#@~M&Rvjy+ zq=TCrP}l>hMlwRVv#R|8@sNW04!lQJv5RyKXjS-k^y+}BN6*Rk1YS*;Uo@0n6T?C~ zSL4Hh%E>OK!CpKn`WJ=`Mm|41SwCGLoi}TKnGM`sU%$*PJe@pKX%$(DJlwzFFC-OK z(8_QhuR+C1c2|u1u}$1Y^1qLdf8v&ybLAfO?{*}5@Tqo3$I&uV;m-Z{3ACWs4D`2J z!q*i;-5V>)wle#0V3g*rI0=wSDQ`-1rB1=JeJr@&f7r;*2odvVmaKQ>`A@3bV0G<;KFphYK50p;G7H6pPc;a+ z7X%}Nw{O0pFLikymsg(?OtJZq=yn~qz0Kx^ZpXDXhk#-O1pHJFX%y3n6D%qO?X{|C z;x5=kW2+^iytev}YXXZd-6HPJpiuI4bsl=(YAt~cln`I2Cb7)X+g46Mbne&B%evS0 z;#RuFx%|39KpzIl4wR^AtB-Ue=RqrSq`8dce(AeNhjr&pEpP<-SYF3>Bt<^gr}ZnZ zB*#x>-Rkbq^2ogM+uH}z0-O0?$N9_3XRDBjems4H+rUizHW}xZ}oV%h2=i*_sj3#1wMVG_2i}@E8Ql!j<@F=0GEFT z_v_y~!{WF9_jGd6rc_Q>2Xk>)zs<`6-aNcY)zNW(gieuoke=85En~Rd!IK*TQmSp@ z05?F$zuy4OI_$0q*znO2c5|7ju;}c@f|>gJQ(nvy9S^!o6xZlz<8Q-7?u$r^j^PJvk!_%(0$;`efK?QK}Uio(~nv4)dF-mA9zh1|= zg!}8ht!V$Q84AxP+A7dH%_;ZOTa-aduUj=+cA>LkE!{oK5z3c#=Vd9lRVOc9S2|X1 zt{iN(D?E$W<+Pjks>yp*JKADlXWliKg~vQ)1IV3Yo?`s-jbinHIVPQpzB`}I)~ zgojRme|oNK4zO@wrC@q8P)YfgtDz5GL5u5of{WJzb5nGk>h0L4B#pCF(di#;FaNj2 z^!Mv+jCD`DO)63crH6Z}>xR|X>7v6+4X@)Eiltxy46gfK-DI*<7VOP4X>Ju~iX3}4 zjl)UJ145c|e2)Ibh};pK?@oe0d~LUqR$_j`u^}w3F1{6jHA=nc^3g-Rf#`GtQH)@F zOiVHfW-lAz7EP;KI75;l7{HHOW8eiM2Zgz(*1az$>}%pwek653%LLgK$IOz8gQPn)6IKMXQr)Je}}QXE)gT8|Ur$3D0NsY|W68#O;4d>LCpB;P8+=!bO~iT;S4`>!BU)7~A^#!twV5;ipKN_-=}pyus@0h+ z-+r5>{rd5-v>8k~U0K&$4!B%>_nivgmO7heS)v)I!NBW&yZyT^N#J-XMet!mY#9e< z+;!P%&*w@BW{JP-#Nu7o_1QmHde~V@%?%RjFVMpm(naLY70I2tG0rC5%hQ&V0&|h<&mS$X^PqI?UuUKAe4f z+>SC#z$&^5eRAe(Jmb01qpE`S%aY~4!Cuw4Dn9Ag-5U6PHP@37qxsIsyoKZCS5y77 z3!DjCA)f0jHMkR4M?{=EdCxtShdYmREfsnUJi4kG3?XN6LLN5`)5wc8My}b|_%*>@ zR`8w&vahgM)7y<-_K|9&heE*I@|25}8jRMrrxXBss&~@-xMs?@a(Ow&6Y3q^3<-KP zvG^p3rVD)bY*jI**ONr)AV=%FxWgWJYSiM6k--fmgMx}qgq8C|ULmjT!DYC5_I=UR zf@%KQ6@fNFuP>+!&e<|vGuB)f6adBYs$?|D?j6hLDc@z~6Y1=qd?bbj3t%0zZBi=p zje)~kBZaz(m~F`=4KUw>Q^Kx$x)G0Bu|wK0aEG{!mu=F$iWAgh)!@NqzS(#pmN#^J zq$sn?ixZb4m9mKk7_o2~Jj#MRBY7;@V?R9hLUW+4?*1|GLV#Ty25`f8J-9a1Tb)AD zu+kI0&scu&{nyzsj$YW|dY#gxhs(9>6(+euwW?n!U4$)c)0>vh{<3fPJGy0f{dTcF z;=ODubz}=wA3%3}nI{kMa5i^y?!CSAl&2qKM>++R^z@b4UpDIEEuAmtab2rK#M1`6 zJMmzbUHxR2SJr3UeoqEN`O1aL%YX4kVIS}Nmgg#B`IG(K$sB@HN4V7noN~-~uU(pI zYs~lpZo#lEJMgRvi~8nRcd5a{5!asj5lObgajn45#jP&C!<@1EikB?@2Yvpzi6%WN zESu*lmoWAXYse!a*u6VIf4KQmKF39qc;g$P7ZIv~*t2y6Nf58Fo;6D1eNW5GMK-;t zgYfFrNI#mFVoJXlD?&UwtFMmyF^iX`Zms-1KSrT*UJJOelQ3CW+gEnUSM%kuW=FgT z>b!r%1LDhEYn7}|>fBUsKTs^hzFN|u>*h)Ku7=vIrqccwo;Idi{yin8niG_fzv@-^4s$5^`_Tm>#h7cxGQYGj*t;egCGx^K-hmDXptlA&owex@9lpL7*p6>Te zKW6eTyjD@JuRk{YCzBE{{^ASZ>H~d0^PNzrfBL`tqRoGU*4S`wRa{ph1UtRf1pr{|5=cO@>{?xj2tR{rD*Vk;{du^W|;ZK2bEV?6+kj zaUSASN2aV^y{eU7yf?eMgiKf0)$H7sMzf!cg|1ZybLd5e6J`X@F!$-o6vVytYjHF* zZ2RtS^MPPzPFu@@x9Mux(=0S7yRSNB8Yb9b30hX+s=ab&CVP3C7^pitcZ0G`q}~c%OkBt*Ft6`| za$bUiJ#GrKK`Wn98K1r|mT5_Y(Q&U&L9KS3V6oY|D0#D$q1zW!FwX58)U+AT-_!Z< zmh!DV)t!3_uWri@Xs)?nJ*eAuoLzK;If<2T&%U16y0NEYc#9N=U5!?Hi+Uw$^BK$_VHfNH^WTb+EZfTr_GrOv6V1Qe(7n+2;G!ul;~#GZOT8nL>vku9&ScC~dG8s>*bzu*gO; zo~^sCpVkum;tJB78Rl6n2i0XbPYnDWR7Vh+dvG5If^YnM4%fQ^lx;3+^9SsP}rd<|`HR~-uv!r{#K-WR{E@5_yLe0Mj3 zPKRK#3!+|8No9~2C=zzH4tXKH;ludG1!H@1A!v@|k|^|WN1p#+(Plx$p20g!3=OWR zApCNCp5-A`V&zq_eR+n!)c`M~I#* zGCUU*!BfgXO{*^=P|b~!RGu_a@Ssq$n(a5*8*iaO&I+oGgGCKlBp zNHi%<2&I@-b8AAHKj1{>IiVh4ii>cEpynZ#_A;L4eD2;zFx=0Xz#1ejk{rqJq z>2znXC?o`1=+D5Mgi)%j(pO_ac|9mQ@hH#Ig00k%3Shu8(6}POIE+2Ab6gA@h#^{$ zA9viBkkGH!K{B8@BMf~fZr3w+UOHlYM}{6->HQr$NCA5+V*Ti#GL&($o|Gha5YUm- z)4ylRs?VfMJix?<9?p|w5=`5*!$@S>auO3Ob>2|oU0Pwm^c2Wq6MzWkypvfdBT&tX zf{$>|J2@sOF@`RJ4TYA}yrlwhX=Btm6}zj2g#lU^66iq5LrFrwB_E%T(ghD<&iJ#q z;0h9P2qH4LnCA>E$<28vp(g}6HQW48jI_E4q$`@bs`ay#Uv9ErVGwGz20$?A||?~N&v;OgfTJ+XfY?S ztz8Mz>Li@T)q-JrU{D@nd_j7W$|#0baj!r@z&sp_d^w=aOY4nfobDEr)Ro+t`GL`)WG~2TLk4t3fhF4(uqh~O~sz= zh{px3Z!LLqC`jBEiyFpiMnr;8)_@>wPy~STXU4ErLnKG$KxhC)Ood155#VA^c+Ua;%B@vBDFTF{uQ6 z?3lr8vIg5o9AjF*&8%4B@Vs)5mGiF)F2l$DEuKwgTKupQ^}5?)KCi|y%-%~XD|3wd z%!|e;@4DRm&?AH_Blz5$CqyRCnyR}lR3k;5AiI%n?p{VOKffR^d^V@O@$wdO@?Wpv z3E@nN5vfc_xsV!Ug40Aq9W|te(LQsm4`rRbL}z;4rusyLOzMPsa&DrMhzUe9$o8PI zQtFDm2S)E%uWnQ4{LFeML2spKK_E~Q`fV+7n2}20L~jqSZ6$RGhY=Z*i-XTDQN%aL4i%vF+Q4{zrE-i zBKxz&24d}HU`rhsV!Y(WU<_IO3?wb_MMMV?=Ph82^h2VPC#l$AFIfk1{2)rjwL0y` z6wZ?__E%0An5$mRXS4cU7$vRLzYkwhLU7YF64~ZGI=82*h#4-#)|V(2$R}x zJvd0g9=j+rXnwsAkf5ar&2B+fI+H7R4uGYLlI!K?by*cgot%U+c{?ZP37SF~gL+Qf z+Kkv)m9GMuWfEfUE$V|@0tut6s6zTcbkkGzWo;#*|v~PVZfHrl+eJ_Y|Jw z9%3jG2{;FM#t5zBVRHh-`uQYu&nx5965QBmLQXO{h-q(e$D(yb=z57OoJ3mmC(qMC z-V_uyrb97vm=CZF6?mZM8JQ=KxsZLvIwSg?q-asr5rXvynTePIsTMU7K-8bcQZ@37 zNeyf%Cj_Fkw?^j2=9r4nww~h+-|_TR(!soF9o3R}&Wsq4e-Jf_y(|q2*o#SzLe4vI zY*dF7qh%2A#5Y^*eSQyRf*M+qQtec=sigFzRzaX6FYTFSA$=H4q$2)7C*B#zUnM#n z`Pa>j>k|k}jG~0mxRHhGa{W1dFv|Yj45cgJP07l{>P;#c(V! zGFmc(#wH`fs_({pT%>P{rzJeC5XFLkL6f7Cz(ofE#VC_F={c{!zq1V_!r2t)85uk# zMO;7(_6J&cAq3Ievt;|$p2!Dt%g$IeX&fZ6=xb)@gvpFX8TpiL16=SR*DHFqKC<7q*?oA4W0gddRp&aH62?RWpBoju7 z49M1+EY0%{r1I<|(`T`}lAd#i&x!N?$tsL*Fy;eHrFM%B?NT-Ui`2uUhmvGUgXknx zJRAfS>g1g<*o^aY7_@$OU)mVCnzx-H$LOuKxWuIuag36oLP{zLZcqh2Dkn1~7?qD* z`Fa20!uavr7#Dtv6X3@m_`eVS#%IM_@x@lDNw!yZB!M7e zgc_5!XHbX%bio8R3Ex^BIZ1Aj?o8Z_Yf~^(R2*Y4&42^ky=z+qed!TDmmJV%m3?Z% zlkVOZjJs2d1!{h$O$JbM3gDPS5RND%K=_h;#@bjtNMySISvu~ceL?5(;5;}#F257_ z;d~tHZ!Y}36%J&keE)p!tZ$sVIF5SMKNI(Cv)&Ug5H#=cR!n5IV zz{O+-$H%~UHr)N)J?4V6^f~v(@fPOSS8}nJ|CM=zk^1orTT$(%Qzq5f4$%Saq?-J%L?2Y zyEg%&1FN?US*uOm?5Hj}F4K!h0njwXtPCd(3|(|BCD>s0#mD~b+m)33tA70I^<8St zf}OZ&MgO%*f@ww(s5KNvpxl!a^RUGaYo;5vj1&C%SAm4>tV!(}yK4QBc5ksoH~6o? z^E{^1UPif1L{Xrk(q2khu%{psXCbz%u3&PStP&}JG8SQDiNNS-PhrM8>jaIojB6(Ln8-OnE<xv|&o_yVxj`(Ds8mG3 ze=K^yTw_R!ND7W0&!5l1;a8V&X!A=+D=^oQ`zWAXN*KTk4Wm}lQgqFUVk-jIGcLbP zMlaw zlaM` z7{-lT{VYn8CQn9M@GE}!NdzorO^Mp2b>fT*+p(>SlWa(7S5n$_6Q`^~yWUBJ*sJ?I z2?+ITxp^B2_3AU~N@?qLIWi#%>h*FQiV(Z7JelKxYTRTAPU1G2e*ho?05mfIS8xV< z_uad9@9w&%>$ko3Zno`fxAwZ-+A6B9ooOJh47#>kYuaVV=!)A#5=lu&Bt9VoQA7a< zpQFZ?@GW2igF}3y{R{Q}3NC)CuC)kj@H`-Gy#7F}tC#&;;H4H_TdTW#sUENu)pu{R zg&+_KuQq59!JzCS?2_d}@UCUGdh?ZKMLk{*d9CQ$AnLth0H8?)qU??f6G1txo}%O` z#}Am4h;R@_nYFKkFam$Cb%w3a@(o&xjgrV%z}Pvdch*^d=}l{6TYJ`uqPo3L?P_lk zb>J3*l{@(|XE%#uzxCc-gz(ny_mb`6-OgItJAw91qtjx}G(#|ykTwCex>Ui}03z{1 za3z7S`}AEM9DBZr*X(!>%CAp>yg?#aTdzb@NvFPbeQB|+m7ZsNSuDeMtyINPvqLpF z3{V53Y0eZRO*#IIXbiN;JV7WyPja!#I#?TOei?#nOwD0Vo*W^3sB|KKor1H z6GBNamZDv~0;0Ze*zdGvLEb)FtKuzj?DgH5F##&2mG0+5izI)G+6?@RyM1eWTS=S4~caoMGK+NN7h4n zj5*j=AcJDkSLRf;wZxFv+GVn$pn=kipr@c(o-K$xE#J?CYmmN$J-&bg5fFQMEOO0T zSwz9`n!#yGJeJL~99CLqG^{2FnInB8%;Z2cmH50_Q!?DP2LT`)$-OqEHMKVI4iqhQ zuR?CZi6E2`vATbd+_5XrJaz_&?&5_=ZDTDlO*4U~E@JSARL zPVN0Aa$#vKY_a^_%VZLDmN@_@MTPAEOH7nh|e04r0WrO2&w1naWY01VFw3_nN|sz|B@VxyFn|NiYw&yNRcpgj$bZ>&{zt~wXw{ItN^TKb7M zq69?Dp8?hainc%iwyX%jk|1kT)~N+IP@HC%jCOAyQ7A6*x>ekluqnN3a%bYG>Jibo zY1DYFJvifIu&QlPa9S2a>5*x9T}`S!K1|Tu{G(wrQ1l4HE^7`bN~|bJ&N1$Rx`5d$ zB3_^F`D_O9=~DLUXOR@s_?%HDRa%4F8Y#_tM4DX!<~Y?Svf-#T5I`{;@#v`#CW)W9 z!1A22z)p0gvP*0fl+}sV1^0+w@_A<@F8rB8i9}QKv((6z`?$5LYRv{D90}$cR+CiW z{6D3~zgs_;>3d4Aq8tteuAWs5%Rcvz_@4cwrN?3t-Dpf9C|M-7(y*2pVkM?Ykt*TEz8Q>L4}nA12lKI@#h`jGUDb-6i)J) zrUXI$4N27%fI;3WWC2o`$JwQ9EUt4jp@iXGYcA}f-(`Poa~ot3De8}AIUWEr6LJ$TiHc4xn5sfs@}_4F zpjkP_x|Zh9`m@QM1RI8%E604n*18lODsO!ZdZ+%{%kkX!7=)@TX0$S`q`km;C09l$ z@aAj;ojQ@zDt489S874Gz%o3|{dQeXn;>N+ZFPlxm0O3VU$L+@_`OwKZ?UV{{XTy( zaT@C!C{^Moaj_^!gVE&B0R{RYo|qyACEX42c;#B=lthrqCi9n4MQ#y@eS}~nP zDTE4()w(~IsaQ(Y7Y>T@xsUyd?IxB__@!Jh0W;M_!vmycF-;ML6}7X?EhP#td32Iy ztx>a1Tw%FWHK7^;ceGQS+JJ;}(ZgC&O%#YeM+s1D1^BYa5!l@0o}9qMc1xW?N4usz z4kZYsE1BUGP+V#bePlc@dn}*S_l_$PS}%L>CihDHwxP3cD>SK961;^D?Ly}}cyga3 z6cVFF_Ei}Yl%L4=I`_saHE7wVa^C%trJ4a~i|FB&CnMo!rSA4FnPD!(xy&eBP{lD! zMDxxzCmg1;kBN+Ns9>_bUI6WrO=%mUTc&PgU0@}2?q7dA#8sFZ0j{ioO2Xokuwdlc zt+dK0n9tFPH&q}*VS^NJpw#WgYN*k&z9UQsARGEm(VK~lM?4;l;7o#R0S7XXlf&5b z$b?jrGSTBO58Q?4$4*5JKgUbLaeOA*inE-{D@jR{aZc9BKZ=;jW$|fpxN@u`a-oo| zayZl^Q_sB9Dan$Q|G1X!E)#c|^PEIyEwmiWK}Bmd91rr;JT->sONvMVUa-bBlk}#2 z7%piuIH2g|XekBJyvtx^k!9c`NIsa_6c>_!IKL$PQYr;#v_P~!{5w|nRUVKWr#T7 zGxWGfQPA-RBSv%3vD$evt!zMy;fHgxRF7phNoFg^{mu?^FB)*ht=lX{rM%6OxOj;# z_+}NQ_h6G@EwIdY%uDrf7F9i89vhLuP%aT8P{as@A{eL4Y`w&<;RQ=LmXFbI#811_@bI7Co*=a>aIB@;=iP?o)X4* zI+7I|-IhtvY8=l`UKfT{8sr1b;*BrKB`SNTz{+9i3`G|;-Y;oj!!Xj{t1Lghbj?JFX=H>6!ZPcrW}Q_Z_H?>Ez@IW6gL@=u!@ z>=!rbIG6DLdF9z!ge?^u4-FG9SJoIDM+7Z^1Q2j?34Oo%sp4lAnjmkpE%%T8Z#XM= z{dWg%vtRp_zGTWhr=_h>&_qqm@G5oBgr5^A;qQXkoU=ezFaFd`j<&@ETihsKpfe5j zE7^Axk1KjKD3P-h80;ox)a&{}U%i*_rmzWev){}f0BE6 zdCSG?+MyO6sKyJzQ+9RY56B?imGlH> zTwk+W;`B+#)+`f-vFp?ls)bl992ZObY4zhn}-x{$B zWl$dBv4ND(`9vG@;y#&0jpN-$28Ti^k3K7Z{~-1|$>-rR**&i zz~d)Sb;BXqU;!`{tM8j!`BqMCA&1s1-^+Y+%>EchDYz5H89xWpAVW@oQ)F}vzf5fPYN$^~P z0kN0Qe*Q1|>Spcg`qu%_Y5u&rmXAr zbW3fFtp3>v29@*-cz?A5jM%HI%cfDx>ijbHPuW1d#Fh=8K6g0#T(Do3?qwrLG?d@o z?NSP(i2MewWzl#}OP{aR;8*`Cq2}jWKNz^t$mnAX=6gGxb=fN_qaL_91vk;*Ln?va zmYwcg>}2c?Cl8M+utWo%v#4nAWfLCuU>f@@eoG(!UVd~i5W86L$18Wh&fpe~+u-!J zF0jieX$z=_J!zvQZtMKQ4zJm9D`3E2Mw1NvAWV1E&L*y()irF`SM4OqP*a9_Q1=@< zBGuiM)mDMNyx@b?KDhM@u<~eI0mP>d!$N=8v)R!~2@34{@XGGdim!&S9=aFa@hCCz zUOQG`F9JU}&xP`L)fozY2*E7%JrMEr?Ti0z^1}}M4_(6^yM^fEg=dTG(Jk-FY_pX= z7_(D5UQmo%7P7E>w8OtY(I3H28BiM>V;J?$dcxaY0sSxI-BrA1dBFSKtnLmAxRvcE z{uYtOv-76Q{^Rj$wD<+;x=eQD!$cf0-|zeXGsWx2mhr|JnaJ_Pw`K$^BP+5e^Sx>= zCfyUq$Rj3uw+wsGNNgYEf%eJtzpo}O7+JRjs_#96Ixi8gs)BOUNB6ish%GwM#;i5r zi78_u#=16;G_d&jEmVJ_Ww8|TmqtN+V&93J5vYZlncnzUGVpZ#sM|rf3xKJ^ui}NHNpsaE#79YL$_#8ogtOo^2d(F-xP8A1#2>R zuz*d9z&zIqh<8;fjYWy?=5;(jdYGfq%c1p6mTZVcGTbyiw{!HW8N0}?Ds%Deui0%6 zLBI86O_6o&I>zEHzR2PaAv)#=A9(4A*!^}TE%rs#ngr=?3V^Yclk%sqCP0Pql%EwHOgr*s^(W)k;6c+TE;*unz zc&bS`AxU|9{Ui`SvM%thgh^ooeUi=z^v^J6KNFunftfW!nk3_u#Nqq*)=R*r3cBT5 zeMDOIp@CrnHG?TVP`CQp(T)!FJbLI49Xz$NKq)1EIf(D_ehcYcN37sXrL!#uNHgV966bY&ZutHVgc z=VpZ43-i63?aSS+NTY4=w}gLR4+Gkmm3QHM%M!wK`6evNw}ct#E_=;Qt#$yYF*ubn z#+PxnJAq&z*OW!-NM)Td(ruh4h_M)tl2Tnd<=xUw@Vf3gfqCjV_=$H4kNVYn{^3;DF!VcvaBuza(*A7ixLMm6SZEkvqEdAA>>SgNjKfbHV znK?DzB*_YtDbqeTbXj309j$%(BX(&ie!DkFDY)AOTRfymNh{2q8j7}eS!%NB`$-x+ z(%^)aw#uX1qzJo3exdJDHWUXjz|YtJT4%#q-s-{hilQ6@tQhpExswAJU@!){QmLAp zdTSf2oBNpiv^Gb$kI!4T-p8oCyP_x9wHxy|@9fQaf+Fh(da5Y8qL3^t(9c9;H44+J zsoZI$Tv<6F?2(CuNvKFuflN)&;wV6>B8?_P5lEp2(xj^=+!Xv0KkDl>Us8lUX(y2!Z@r2_5_&fBfk2J5u=ZQVklqR%=8nf6aHcfNbA5Oxn zCE&6{ek0uNTn36%=&HeCNkTuE|B~N?nVCS`7(7L(3`Vi$LBk#@`CJap50Me3sIenV z;nm(E@?%!y5^D>SD5!;1tuz)h%-aL*SMop<=aatE@=U&r%VvuWtsC#~^!(HP+#6xL z`&_?1M&?(2+AY_BJ6Q)t#b-v9PCt5`3jWBlqlnatc*Qv*wt=3VuYE=5slKyRa*|k1P843_=y@_REKj_&rprKXn~Bfqrmiz?>t^!|zd(7kB^!Jb z+(4Feh%Nw4c1ts?4)nFBZdy;BR`Bvltp&0ApZ~u=(|4>HtN3!20?}hgCK_+<&Nfy4 zKP@gH`!>O33$%ghjom$ddqzjM*g5}$ImH~9BRS@Ij~MJJ_QxLVG0=O+U`a7K24j%2 z{{ytz*0z1>4c`LX`VX!OBf(t zTWUU**K^zMRdD-P)3(2})FfIoPO=Q z<`+YBJcq zV3*K4Tf;pTZs(geZmqhjMt4oQ-)6A7!I46;vn<9AeHT*Fzod)+=m zTx-4ThwqB=?nFZT4OlI|`&RcAwsI7WW+O4TUD`hF-L0HS$T0w{5X31!y2+jvXP`+*( zi3P3A`ia|a$|yGae>s#mT|V9wbG1To@;QF3bFHtM*)KsX7|#X+TIh7`UNZbQYOQsb z6-7PJRxf%-UWtyM&;ge0fU><@@&E%dz^Gyn5CZ@O05U{XGynizRnn^NTA{2|rB2%W z2YdUm8^9rAcPyYAL6t61D$ak7Ntxs`FM%Zge&xRaBQpjxBLG-%0ON{(cbr&RS4tb& z*l0-t|9;ZY1vQb|gs4k>6W^ypA3$3nG}H?>3GiQHZ~GR3fvvswqzSR>GUY%a)UnH# zLrD>+S1%Kj6jv|hB--rQGRhpM&qd7QlfSQN0@@@=5=gZG0FeOD3;`G~SngiZy(QaO zlD8zbrDaK0l6K22+e4C9H(+uFz|&k@L480ELVT0}!fNimZXZz~*pv^0d<^-qK0Am4 zOV38f*RZi@&p5hZ*3q&$YSG;~=pn()2SZqY(HGiu^;3O<(R>vbQfJ?auO!MxaPS~K z3?v}k?~mv1P+5yD9;2W|+IGN&5C~wU(N{Qq(@|E~^8qBXVS0ybSlPtDHM6lmz`ZoU zUwd$yDV^OoOuu&cL!t0fj)ANeYqBNn8FT#%A0uhS>-GDY>y1t)2|SJ!Ngi`?5lb1$Hlx1U-hc-muL>dzUYz3l{P}OLHMMo}!6;JRuixQT&7+)<`=9HJg z(1(6Xe?=bzKR@9-0mo{=LNwQXB@1k!yyh)R3Y~iO4_?)Z=;56c^e9C$6Eq$tPk|f8 z>SkBT#9=;o{0p=Wdq!A)-3FsLtb@chtbtqV)?b5HeGF&zmbmQv# zZ{VV>GVER$`tOmG+IbW<--~|8$yoWFcT0>qHwptZ9IU^S`q?~qxVK}f{S2Xt4tmY* zZ=h3j;-}~yet;ax=l<@??{w^)K+WSX-P#+<=A~|JZ6PDH`=6Ly6Z3}W>%`RIOCpaa@i^c?4F2nN zR|DQB4XeTatX2&dmZ4U0Y`Lz5|@~q}}!<$ik-U z|AwbkS=w~c&TjaHJdps=+FjZ{QKThXJFDYD@~f)$HP2*Yd8QYxLEMj`vwIaIkWLb- z=~_B{ss^m^kDsMgN0ur1F2hiOVQE#qw9omqd(fZaCMS1wmtNV(ljI-W2<@PfVb0oP z{MYUxFUjCUd#_6R?QR!FoGuNFs;w(`{Pdas%I`4?LyRQ;rzD56Y<&2CM`~S)&lfe5 zls#cS;^e>JwA-7+$KyTR6>%SBnGTCT&RJdp)E(6FaQdQ;hNDcMUp(r+`8Qp!dF9jO zS|2ZL)Byu!li=kJGrO>~{ZJkgH}XS#vcGFB7_chXo{#s5u}NyLMH+|U7A^6)M|<%w z;^)Xh*n97s`yXLf*|!GtA!N^q5u9Pjbf2kU{j4u@R=(D(N8hP_U(kpD;+!>|Sc6B{ z`{XW}eu^2jz&z3K-xoKxPZwMO9J>{*kcqG27fA9oP612)lg|O2umA6t`s0Sw#)Izj z@?rn=c%Toh{UYh;wO&#^VD}D3quc)@^e7ySv$*4oYEyt}%mA26CWn13pK_=P)QvmU zYU4WQs@xT!vcZwCCspU{M7o#?JorC;^G zRt`g&%9Vt0Uq!zg`WXiQK)p0B799zk)oy5T9mfPIWq~x7PO$D{u{_Nu6TEgzm zTNy>U-wzi+ickP=#+|x0%w6%`TaMOd{V;7637wtb76Liy4K3mH=RJBsUn}OFw^PEA zyiWL1Wu?)TZ}ysh-;>#Tn@KNY*(!2(P6wk9=IKz|yjOj{W`WL0yN30f7L@89TWcdY za(7Yzt86T7}*Z-B6_D-pIMS{ zL1F(7S2Svk+Se_ubB)N}d2fg}W8DfUO*IjVn?r8o$8>xdKdc1YS-L-mn>DLlIxbYO ze$W-jxO1Jd{MpG=8_3Wz@uvw<)j<6-ULbmTpswp9o_e4Qzr zu;0JdM3J^TK-!xl&&T7M@QGRjrS@%w-Gx$XVYpWs+A`&OJ#H!GEN&~erR$ImceCCf zc?-{AZHFr`_vYL6w7GDP_KCo)vR%FLei+ajI&xZgJ!_jcF%ARi#-KoEZKhh{fvX`E ze}BZIYppJVl2)M%%vh>A*8sXQi6 z+K)1`Hk`~l?r`DLfAz1VCYz_i&*M(%CNZwyy2DzS>YiUQ4ME)E#_w3{1to)I5MB%r zO{1?paa=7NC!$4m8jTDMJL>csFgN&yjxbJg!~1Qa*xpzb7VA88EV*_!Q6_??c7>g5 zOCyyecxq=Ae?9e7uHem`ndhlKVQoz;czGM;uJ_xex#@#amqjOi1FZk<)pjv(En)Wt zH}dv(8b-FeaE0@jNaY*hnw6PLEc*f4U<{1o4T+r2YEqp~nUua(2;WWb*b_Vvwj>O*C(b-!&8hblOGu{@X zDQ}I@7`MkukE?PX?B3ct+w$4oIV8`h_LDDKd}dj3qvmnxU)<)Ohk}#eU5%z4bbW+- zl0_*|$pMJ=SMI+ZrNQ5HAAV)4h||>%F9ie?R#FwuJ*@xov;7;m9}FzkcGj^o=l!|Y zQ1nBVT(7P^0+&s#ntcAAp9lfY6bK@6ktK;d&L(Ll02jKiYV`B<)7)4nJ>9; zilJ$cVlvos#TY=18_7HAWNdrt?p&hIRJ+bwS;5zIB49~0E=9T2C}5@19c4LLT7!2! zbByhz$XkOOy8w#N#8t_9sV>^XvMUnBpd|%qRhHfo1iSB{NdYwQhLOd<* z4~NPU{I?%wK98467{Kl&Nl)p;^6Ogw0JaivQ0&tgFD`LeIfbdt0^RgIya| z2swMzh*VgI6nbp#ABg2eI#wO@de4ypdfvL%`vWHX<+@zrX^eco$RF;wmI;55OY2ICB92u0# zt(>|YoW)&c{2li3YzXPad&UVT^*U<92cn>=cl6SX2Y|DCTDUt-m3Rv zc5FwI?wo4EE4am$sH-Jb6j@mkFbO^SNg*L8k3r-8$v3|0zQWe(I%i=;4J~SsDy`{2 zln_puqPq$sHLi}_o1(cPmkHJj=XNe_H@A31)K^h6hsa&P9LqR zpbunn&UCEG(z)r(=gFoAd2ia>8!KI2Py*ZOqsjB)3v#< z&*emyMbD9h3Pj;d9tM+LE*Ba3@u_cY%nm?CXMvBcvZjZRyf}Y|Ie5c?$drozvd|9G zazua$)gHRgUC3)rpgOBm383VU9wxx6dst33tmcfieDqo_YgF;9tD;?37KZM`JC!e{ zq03eRK6IKawbr$!SEM9+dtO2|;+jz`-6yH@j=UH|s#*?A|F_^?1yv z)Cjpjb-{bmTin44b)IMFHbi}qQ<`kn&8%xyWMny-`d~nLaj?ZEzbH&EWg0;?FEkNT z^zxLUsy_?fcE6sI*kc{u%$UD{FxyY%Uabl#U$xQ~rl-|-;>1x@OqhVh$v2|o9rq7) z5UG2%xqd=FWxNO&rS%EuPLb3tJG*Vs4_TJE?jk|Z>LxFl42R_9(O`rNUbsEL- zFOvx^$!J-AMcYnRx%3!k^3$tG!m@v{mXn;oD0&<9z9T^3$C3uJAb30lJ{iD4)cTWR z6ObxSBVV?x9{2mmbSc}TM=Rvg!V{#YVGI%F7?T!<8e=wzyKg{2*rXla44FfMQ;Tbv zj!_|3b?@~=6uZ6LNG1Bhxf(Yn6~c>0zgt^0so?C%01fA!s4FZVcy0*-N|huzQXiqW z9CecGYV6HSi!b`gpSq?S&}YjS6R@h@u&A}$U$6iSQ+r@Pv-`iso0-2fQFT7lz5 zchR|JHrOz12~}WR_moO{XNP25E@tGP`Rxaq!=)536Or=P zQ_4Tg6_$)T_dIg7tF96I(m*hC49cT_M^|UB$$>nH9!UY=x|d8VjW%e^Q6g8AkW@@i z=Ac^DW50HI=5@43l_(H7=X2qyidKbc6KQ-O@$g~|RvE!Ur&nkd4M zL4iL|uCP9e;H7C@%FYj+StIUkIhBr+B-VVMZeLHwQ;Pa~cP!S^A z7Bd?gv%@m5I4m+V3+o9hDh#b2j2whXZBx6k{HD^x8GJ>|vJ{2*>zB(PJA%`_{fN?p z@zf$2-iY5iS(3qh31w1fcS;61-14QPl><9nf}D?DO?2qXUKSPj=V&D>rIjt9!x1;> zvU`1Zid-rYgqQ$1itG}eLkQpXMqb^rxFyJ(aRAeBnp|EJV65O}tC4ccCWDS3Ts1XJE;K#>33maU!S2S$(Cbcd&UF#HhAJA;^E4D^TLW&bZ&ksEuWZ#>z|D zZs*mcjuAaWQME+0)>omM4bsFg?p2IaKZ{En6)eXb-z@ijbli?{W>($^&Jxy|5{@}d zT?i?=Gu@IF{ibKFyshOZQ7JALOcM{Zvc=~vh`!Vo6j+9fK)J7`zkmdxP$`m1NR_2#f zi83LXy47W+s2TUn_rN6zjww43vk{x6Nm0Rf(b(ci5b^wKEx*PwX@MM#gMzJydzIfL~) zCnIvEi&+QF3vSCeto_cN%%X^MXe)<^GCt?1@ZW}*Au~&fX0DQ>OaTW5yv}O@Iv*A+qs$%7S*DHB+o4-ruim+2tZXZ|u$vktyg;c1WwF{>_ctCg#jt0_~Lr zBgmil*()4WAumtQ#1z42CVZD&b{5CqdIm6|I756PkddC{^2NcVwP0|NqM*n$f;HOd zJG1E_JKS}AG}%lxkKM&Hy^4d)5S>KNzL^|GKir)VMeRTW;;7&j$nG4VRj5?rQoyn<0urdeb_Gg=h@6q& zPPld+N_LHSvy77-k@c~@*qUv~5>5O_$Z%B`(NH8k@<6c*oN`flIapH)Jz0EJIhiSC~0?sokf-%2Sk&AAJ_SY zsJR0Y7bbdBJzgx52;P8H=~a+0L2FeUDA4JkVOu;Eg|oY?>SYy(N+n8EmM}5oZE>R1 z@Xon;fU4{AxtE8{SJ47YIpma!m*C$wJrgz<+)R-Tso^k|Eb#Mbg1bOfMG2|Kb{7)q zEGHuH!hmNQgq0`0b4FPibQ2s|^JN8{gU~=$4`~h|4jeSKAXI`jbj|0`g-ph_wLP)D zJdv*oEcQ2ds&s8wCn~6Gu_PoXTs&b{swSZ-@+W+VG@>u`TTzo;smXLD8AwHbb7Pb# z9!HR{6-65Pt~gV4R$QXJ9^01)GR1Qb$Pv8>U@s7SHQ zA@CbPb}{2eknftZ&5tC%EzW1qikwL0B{BfT0?w&d4RY$3Ue)gG-kgV$D-3xq^2uqn zmmL6*#%Z#Iu~}OF=1Q1v>imyCZDiiIjwd;B4`hnOX^MpM9f`n~ZN3bsG;~>%{>KPk z78++|%UmiD)SYCs016OmB&ZX%UBt!|1_lNO1_lNO1_lNO1_rbS+`tSB*bQJ{X-lcxc(O1$WNoZ1cWlKmRT@=B0D>y$9Y)^M!haRv1>k+tv2| z_4*Az=hLR3kF(k2%=;g{9q%vjd-$8rGiwX22K(*pcA7}~QM%>jfA$phZq>@#b+oOd z3omo+7}I=Lt;FyKdnyP7A3z`^3V05nqEuq%F&7zy&cckGveG!gIY2=`ihB@=>Inyo zMCCZx&kxOrYim3SjZn?nyz2pCQ{(?^yX_&u*@G-nSg+->lV{fLHs?_NV8n8nI=K;x zHCdn#B1t3UP1lZ{qJJ|E14?s6aEJ>ajOwi6+xu!jx*%MtdV-6~Pu?utXS&4dX$DFx zU=-0H&j`pNa3X=Zxut6oR4MOJKY21GPszT4jr=DVa8#h0BRP_$6Donuo(~U2ACl;x zUX27{$+^KP2A3eqW)Db{Xnq0ckx_s(rdf__L+ZVj1V`NKJAV=pvdmYeW=W5eNC=OB z2?C0#F{PTQ;SU{28Wc_F=RqVgH>=BtS!Gn?2);Prgc*hX*i@ff|5+@s>o3m)4n0J2 zWetB!Hu=;I5Uq-UAoDU9P~A&d11PKJ4-OboQXcAT*jLQYaMGQofgB7VAtP56=oPBU zE(qn3-5lAKchVM3TZLEwoTn8cF-SH53PgfuJMQTfMh~a9FOBLdKAasV z;wa>0moDCyS$JNY!zX;%afIi-3IXHF`{noksPOWrN?JAfa-^Ji#jlf>{^9sH>^td| zj6)BP{6%*{sb9n_EGO4}qx_PrlxzL8VqG{5Z!#{=(!%fXKMWB-EfKJe||qd5-YKdBEjy+BTtzl^Tx=pLuO)s9quD))B@he2twcS5@T9A6tvm7>67v`LBNxFNrNeOH z7&xxCSP6_kr%(iewTjz!j|K@APS?&>Dsh0ek~!bqLEV@eAh=Z{O7dv^T0kC5K(jc;wm?n5Bx%}sA!}k#g#ZDC^>gc|<==aMX{>^Jr>I#|&;Y|K z;%G7}lz<-50Od@uRuk>0V$NS-g7mTiS11X<#6m+5t0vggA$>?ICwX8w+quP(yS;_S zh&3Fn#2+;91qLIbcBZ zcBK+S@Q$cpe(WI)V88fzBR&c=bX^eGk1x8w#=AwUsES==jyVtsL#F^upbEjyn^A(w zzEi;jpCZLRukH4l8~f=xLwN9wu{8_2 z2QBoFATdx>1Xbk=H3T)PD~U(|yKgZGGd6Nw@iDLOxjF%>SE!*fkU%Ql1(mGT7*Kox z)o(Sm2)YWd_qQs2%z5XfijL6+zif~wR%58f^CxJ#1u5f(X}!~|W5*Qf#0oq?Fbi8% znSU%?Sfbrvs z;sdsR*2uDit;|7c^G)(SdWWo0LOmrI-6OO@A~veaTZ;{nGpC6_)R5fR`HgIJf;$7a zVF~n5(=c@mQGw@$U#Ay-V1SVz1+H-M=&#tfN8heRLfA)?j6JZRpu?SIfxrO<5ko3Q z1K*>(2iJ_?g#=?;V5XI%22w(tm?J8dORvM&--BY|bz>0xsux377W${>eP(s*f_GlJ>y0H z`_}93b8TfL(vekbOrezpt*g>Qj~$L=XxHx`fvf%|gX^L6+dJOBf^}-FmGShm?=Oe7 z6G6cXGrTw+27DH}n!*RY(67>N`v#lrq z41vhfAp?3ntJ1i;#~gm(3l4OcuLnk-^$47*NuaS-^^^>xNH&;Jx?ho(;>Q_r?v${B zFE6q0sB!t&Ec`GJ>0;WZRthS!Sj$Z~!YojHC>n@SdaCa?Oi4Y0%Y4kGlXiUXZVdPO z0~`My`Wo)P$o}BZPe<8e<7v>j@P&wSwqn?_92nLNA7iPKK^#9wr$$gYwfsnIu=%Sw z6ZIf6u9|B3@T}J~j-wex9H0#G>YyxYBflsMHk8MdRnjk$; zCjOPKf=dD0Bo^e%z_HJ|a@EZDn)gQkB763j zobt{Md|dQM1lw_XWuO?Eas}z50DJpa8-g=B5^VvB(7ir_T?~LKKQ>H8x3DNh zQ;9-UHUe~=(1_RvUTru8r<{DTTOAj8JlHP`oTk=X07m7| z9mWjlNlG&-i-LVWd3wJ(oHJS|gl3aoBe0s%kEoJMs!w3>54ytI2*v8B7-Sg; zOACU^i&uPEvZxNO{Ysf%xwgmDr@pY7UL}N%Fh|A9G-3oQH^8J+=fVpc-=OA#QKKQx zDuW?t`9QuZ7>Jn`67evNJ1&fp-v`sjrMYv(q=X=}gdroiD4=?F=vV_SG%zlGe@W9t zf6`4gMN{#%bleS=u{z4rx&l2s7O-?FNiajqByvLmnDM_@gv=Pwu=K9(Th% z!j+i1@R)ILgCW<2uLteYeKk6pHgJKuke?7L9SDBHIo0-%5_Cu1kwF{p6gVIn6o|_9jIZ1}D;Ut5Lm{heTELlAM!UcEd4~tbA{K{ z#PZc!N1mR$CN)R|R@bvQWkXD$-l>?(nFqkEG7mz&QmIrro$%vW0L@FvI7Lhod83$c z=8Bzd1B!E?OJ=K6nH=Y%0d#SWA32{%?vk`f_HEpO?H`^aR2@ zO{)z=W5;VszbbW}Zf`78i3~)(-&D^56<&~0kC7#C=Hwjuz{M8QX$d6JUaw1aJJs&# zJ;xhGB|0V~o|z1VQb17+VC^XCI@LS&l4|!4S@;J2;}y)F9cTn+*-XWR5QxuBqGF6f zRrN|>RyX#|rw(uhSq-K%1O#CI6*Uc~jRaddIbDDQZTA^d7TnuZ%t9=v>0}6Eu1V% zpRZ>u{ZpK4vU)NiDeLmrnlns~BAL{ns`;3Z00}7#LlI7N1;jLHbs&F9ZP$6}i8$-{ zx~HOGbD(Hm>nXKdyq#32g;uTwj{T|z&HpMGHWPYU7>$wqzjyRWB#gjZ$N$B z#{{`OU`=ddNKiI>Qg<+)YD^|G@pBj)SXam1WB|dRVGZd0(f`3TnUqe?`?YwMnvJXU z@L>2ZK{j}pi*xV&P4O+er_T6Prd0u^>?M9JReBM!QKm>tK9F_;XLX8R_gHbx0SWdw zj;@-H&JG~x>;!qhdI)MWIe*9d2e8&FNeuihtFyz~Z0y5Q_0UC>F>l89RlX=lWRZNsRJoxJi``dxe zjhc!=ti(Po$@!r@+(aq_M%Q2}XgR{HniVY5Q<*FO*-m@f#t&AKMUsH1B0~Om(Te!E z^gw%_4D8d^nz1-P{pLM7ci0+ET#J6HfJ&%${_%qw1^OE$h3kpbwmXX>Hve=hB%ramhZ*@A{n* z+wqZ8z`mb(|dFY7zqET5i{ljsFOQ>oI}=<@2F{)rb) zWDo30g#m1hhMR0rnjg^y07|K)o#HIlCgBct!$E)L`P}2+df*%hkL0>RH37CoDg$-1 z7bAWWWdpKTBzkFe#W@Q~njW3%l2t3bO-5K*QKpr9GjJP$E2xm>-@&T>;5ukyAS>1w zw4>bXP?yz^d1gC`Co8*?jdIq+^Tg3-%w(p#HkfL`0+)00f3`HH2B@y6cu~07bIK&W z+GJZwNF@wVyF3b6p!GAjLGJrxJp5KW{9^!*0J0|Ls$Wj^IbYt z$Et(5Sd`b#6LM%&kokpHS_26Vlbkd0OL!~bvL-xB7-3vn#@^uQsP9gk*KUkuVq0$ash41m~)kvcXtKqgk*!SdyNIKKi1kVj%7S@(;+~YfV1F~s7E5*Bc>?#Tjcs|r;SDpE; z773i076KJhv|`$`4;AA&0K4M##{+48*?~ed z(4Ccwz46^8hGA+{X6+MrUh&=y=M}Z2b%F4U!yGGxl`bJ)+Lq1|Zfa|?8g_z9NnsAu zn#p5cTs$GiUL5=WsDXh8NFdlbAu5|Jjg?;MCYo_W#KEnV)R}`Ny`ICs@W#Si9w+Ar z?zT$7pC?Tgr9o?+o}-{O56Meo=t8WEM&q+=rfx4^%`za$ssw(fqt~JMgR#5IGP3-nwCWS3!d6U8F)?x}w&$D2X zC6gGKs!~eXBspGVi*5!4-C*ipxj55Bz-#PMMHwxtbGZ19#T34Fx(#ym;gQZ>|Dy*3 zg$w6`X(qVc1NU&hEIZuhv}U4aXJL{4Q%Fy!1|Prg_O`+rvZlw06L`?_Y5m83N}7hF zg{lFGJ6b2HC(s_Sd#+iIG@R1SZ;7T!BD%^>3WxZ5m~cmO?ZjCFGlX4|i?Ice>?C4U zNa1m9E&GHk*T%n^h1dSwUhtzaJ1PACy&I~4aI$2JfoaKYEwOB%a;o%a_w$4aKBCt? zRa#PX>hytbGSbNrnNZS8ke zAmzk9tB>kA+$cMwDq7HK^5*N(CIo2{ z_nb?i^dG#zOo`H5bPL&OIk)Np;n3Y*!{$JEtUgj;K}ea7DIB@!#0aLwIX26I4nyAU z$O&9Lj5DSMy#;I>fa{nl?d1Bjxf1Xx?rtx!105f$R{3b^ZdGoG4mkl)ke@CUpM+dK zxRcyhd<{L0CVH2+u~QuD$~Je4W&RQk7`3PH-yFT(#KYyi8TeQi()g^H+iL>1H#U~v zE^KXrR8zRPt_?nq(!@{bFxz=@Svl-3e^1|yUSYZ6&WA(^tb{M^ju{)UMA|2`OBQ%D+1EhKSG94B?qV#v7RG7kDCKBdj;*mCFa>G>Ff zEj`car!muZoV`*+AlIWXl7bBHf|QUV!x*9d2RAk zBA+T=-kMyHl*{3EbP{#WWaeO9VBt9USQvo)p5rjZH8M7UloS$H^HS!#Z$tPZo$+>{ zY70ve=6;fR6wAbTrzmLWvIdlRTtV|Xj(H8eH$c;73Afi`pbxvnQ~>%?_aI>$tr`Am z8~;pDBtKN8CJ?2j!kNvZrbd&-w#u8@0j(R@!jU=Vy@<~nFgxQkU5)#)iVV`Mv~+aU zoY}BrSVtceF42GWF)fhBiX=ro%3Zr4(!ROG0$wp=CJ8p4m?d!L~eK_)^@RMVvE)1CHB_k{uZ?NED)P2VhRA-=XnA5 zV?#Duc;*|~MEJzIH(`H$gpD8OlQ6qvZu@Sms^4ApsCx;k|}yw22cK&xN+0&o#m-!Hiq$>Cbhk;HKPf z8N=lYi4!7e&O~gBu*ThH8uRfM;ww=n*=b zJJj=HpR@~ly7pR163;avVLrV<`8htyxn*tx%)DeDd4<0dlC618u4N!+L@UcY-kw&k zY*k${{b|u6v|S6#5`C6gZt8MIgm0$>3~x_XZ?VhsAbTuOr;sauF^S)}Q+sAdS?U7z z(C1kZuPY)m4)@3JWn}5Btz!Jr`m^;;rJ0*CmumKU!MoJS*T4)x*p7;X2`v<-;Cb0b z&N(v&;U(44Kvov+-4{H)tvkqYcdmfE-AOal&w{C}%R%LpPw&`sC#X|z>k>FG5qHJUcNlFy^+&u4l5@x)Ev55mssXS}z0e_CRRcT0@OIWE} zx*Y+@y8L%9u;zL14}R@o0Tyq%t9MQ8cdt8;P)wws4>6XCE&V*l<0$o1(uiDb8&HO3-Xa7@^TQcgB#h2ml*?Z?Mr88UJ8r@*t zMDOdt8<$pHv$xA+Z=W-8!@`E`uHAkx&)ZN%|K4t?hGCNy zPAAz7pVh1b+o(Ak%L;2`pY3gC=NgAE6WSo@;C3_@xz%hq52*w;O?!w%iq~5T)0&ux zdf~PW+vs0zND)2vy${6GbJw-rq9)pyj9~{)sMoIB;?Ow>{6bsxA=mhJqNps5W2UY4 znadq$mfAwYRYdrdFyQ97BuBZvnILfxc~+mx)Lhi=zVTcKmsp;;EZ8aHQZ=vk25>Yf zPsS?TEt%@I+8qm@DzZGuSGKp%v4jp>P#A>nYUxSIR`}YT`qKNCsoJo2_r$|E?Ty}^ zw${K;2HFLSTYr6dJEu2mqE=CMh_}Z!5jDh?A(35q>@a!gBdH?ZZJm*y{Q4(I);j3F z7FNfdx1_*!xILGEQb}tNb2k<`$lKdHl8DUqNe@oY+jXs}+zdnORb>@<-ueb^38)6! z@^GDZ(cauj3+uHx*YM)GdQz87HdVy*DJY$H9GvXv*L&wWne2Bpy4(?bKh5lP zNCwi9JQQJRvO9sh=Z+ObGJm#V_GqXX!hKn)F5By9IcT2rMd-kuXO5Tl{C!toC_9_n z{8{9u?QwM0Zbtc~CYziGwlv;Je3{reF>n~(aa3R}W3=9K?c6s|o zPuvHSdtJH{@{n2a;h5PXO($bSgxA=sErn9fB=$mc9s zriol!G6BXCaCKJKYX^{%m2(z{J*!Na1V~+e$H<0uf z?(A^1;#ugq&jc}nnwr~U@+dc5EF^+5o@UBa-0L!g+IS?{#3_ummx3jXLS5@yx`^g# zdzKDj$+UAZnGws$0dpuPQ^VWnl>wjYm>vdXl&CIW`bg&IiE(|6SeF-CrF5)mvhT)` zX3Q3_nN&g&MWgc4Y;9fK+@Sgg&q_-G$n9rXPJCtIz+|`^j~-o6HGM0|oZEaGZ!f^p z7%OgGk$s4_ycLg~^1kK^L8iqXQ@5;ePY1)`UyMdC897!5Y>IlVn$UJSUsFZRR+QTLwYvEu|_f&STFWqL?am zQ~T7U5qdVink#!S^H8CAdJITgj<@tR8s00_@x3B*;Kg`ynVF6}HzQ8`zB(22`id!JbM@u*OD4$F~zR170ykSmP`VY0K~S=PaU&I6cc7KD7AWsTEGTY zEHZ#fi~XwZ{Em?dtIR$VUKr-TR{pfi2GX&dnPsV~ngAr!x$3$X-C8|eaWAIg4rKra zNIr%X@O1GMqmubCPj8`0kL~i=fl`%{hUj`J!OL^`GvZRz>E~$5uC6RkzJU2Ju6z$H zc}6F@kKR!Pa0kefGc!u53Jum|QeHLa!K$6TXUg`f0z9J2H&>DO6vN!W!m*}nvf`ou zu6^sM2KXJ@LEANrw^C4RMV>2}emyFM*3HR^q;+B171btPQ#d4BsmZ=&vy>!0cGz&P zp3@~(H|DB~%lYd|b zO`=21HZ?T;Y*q19XTSy)`F`)3MAA^EntKn8WO)Ev&oXauQZ2PSoz@sq+E>!<1yO0D zPGal+5^1hUg{LqaDT-y$>LS=m;P$S>Twy?#t2D49HdJfU%O;e@^zt% z1gUUDloS+V90>Y&TS)`Oa^uUIiI=#1XMDS4u}0>UP-wEFb!cK846q^Awo<=NQfkO06fb3FHmd+lC6DT= z+Fr5zinoxJ0!&2PvgImeTJXfxN$>Gajyxoadnj9m?3<;nE${i)FH;aPzBNvRfj>z|D!*zJy}pS-Z#7-O?&JwMh}_& z2mRv-#;+Iu@5;iU3iIObcNCJ}*th$5ZvXo}>+XZQ5I*znnD?941MkMazrYmv`vzMY zmn*ZAX-Gq3;9mFCXr4iQyZ+di@16RK4-W(A@BEo}^YJ3=E3?$P>F>o;XwTa}&Ql?g zGe3glc%na=uEWNo@$P@|Y}@=oil@ZPzi-{Y@3T31A3p9hc>Z@+JB@e9zF(j*Qf}nm z?X%(4DmJg(7iS)kp7J{jG=?4Lt2`NL4;{%QBj z^LhM-AK_CT^6=tWM|vM0d^w-%{Zzj@fAinl@nqPvyF$yme^x(6IZy4B`6~~kZ{P2` z(XeT4mtQOWHx7N?Y6nh^cwgMA7HZ;|vT{80YHq@1oZVXczltf`Pw^Q3OsJl$XGZAe z1)mxoAU+ZL24Acb@ygG;qJz_QB);_c{94y)t=KeQabDwq`(^I;U86(y_ih5{4E?hI z<=#AD>y8T3R_Qz*&wT!nA1`LZ8u~eT?|b@+X?88|FH~jVD|X-a@A3NDFJf2Gtj(&7 zMITPXFNI)59%h6bCo7E6bq7lMTA9KBYw^u}g1(I(e&r(@}ljM|?Q{?Z4N>hc`Fpm2=?Mo92hOds`iv z^cS7w9m&r4?eudv{yn$m_*QkiYx47{N2KoMuy#uGf4XJsFwPP0eor{5&#63F~Beq|s&GDbqjV)~FW<8!< zye^)QvSafjS?*VpcV2wOt$aLkf9@PHIQLV;%jc0-=KaZL_?ej*_OkZmY#g$eJ|YOi zP{sJpcEG0{Lm=L{`T|HBdt&-$xts1y%L2K~DI&^CQxP9$%s(A9n5-0#q*TWV) zm2rpcjnGUDsl0q-DhFy?ZA1GrU}h`yT@hb91XZ@9t2z5XuHq07X`$G@1(}q5$)rYyib6P1=;YL$e5VFEY(bg1>E-{Z&TIX2C)Y>s1d9Gm9Y_5E3;{@4G! z*CTDOU8UJ4_s?cOiv-*Iq_640?BJY-;eA4>Qc-jBE9m+Lfx-lsW&mCDR>be*ID>wi zfg_kFnIJOxG*dclb*-}kP02<#&`Bj%{x5F?#BSUe-=~@hh=2_6%c$%8(_MQd%{4t*62;eSNFNv_`qCC~0 z4aqL1y18P~Xb3pet%=o7zZ0V&_hRcrve>1x=!irNgPCS3@BTgeSAc$|vim+57Nr?< zed1|xYOPEFNs_BD!91KE&eksz8Lu`|u{n;-b8MSq*c`{^?>GF{O=Nm$ANkn#QoN04 zmGrV-XOrBz^+J{AhR~fV5+l^drFKGQp;`kWkUH)2aUW%R??JKu@dwKO%QI;pBgO7Q zqf}Ka5OjJDf;c*YaL=8*^xnMKui-HAZ?M+=r*by0g?5mpuyxQRZZL;I7({-Nym^*W zlt(UZbnf>)wiCZP(DQ);;|6k(z*(M2$B`r>l+sv}e45l@=iLnsuy6hQ-%pXiP9_Lu zu7`t89A~ZXXl>{jXnQ@Je`>%T0?n?&VXuq;m`z(dlEqTI{r>C-$NSY_*nuXwbDmA}FI6Q46zs9^7@? z*r$D&pQ0&6y!F+T@31coeduKjTl`-GV^5B)W^@$p&Ty$jsUd}dF$D&aBPIoqss=8y z6d|=l%hM>_Jn3q5N&RiW*DMOhU@6Zl(GLgTbfI*|_wqan9WNyd$9YZ6&DJ}#9oJ`V zDgdGKB~_jd;aJPD*Lc8t#&nP3it0n79G|z3{ndNe;$RJ z5LvmmF`x)7Lt{bGqmB2kdpiAn&OUu#!QQ)lmmLH}!Y68l*DpDHdJghX;k z;ID7N2fA`#c`Jrrtk4o#Z6q35ttJOCXkSPhlWV+R{+fW(9%q%npY8)$0crB^+G;VD zuHcfr(};GtOMg3x+ym`#?29{1*_>78te6EO8b2tGvnR?7wUOystnR0bjO< z#`ZqhJNk-FI(d*rj~!7|S35PZPVP@v;T8;4m$(_2C~Fai)@1pJK-f?`tS)fPe=A2= zmJV*=IRh$X*R&%(^KCt{LCYe^}Plbi8ajSjL-mr3eFZHAjI)rBY_U(n!m-|SUN1jt=cHPg@c$+O0E4X_62!M zGFx-)#F&O>AIZ3NQD9_C#6Ss{?;DXK5uP@vKQm)un=9>pja!9o zIV_oqf?x9xQm=2~Nu2MfNX$y#T}g+DOou3t8?ptVHe}!mXT5*rb4b| z=hNjR*&?h@d`;K|vBSrWz4p?};wRyZD9*}QlsogH-KZ-$Av3BN559}+)905SF8|q$PWZT6ZFU}*IJSgFQV@V z2O3%Sl?COe8`^7rnlGWZu|-0cw_%_ALWNT7tR6{=7@1vH+uHhYwb7uR$MYQ>RRE}C z>&?1d0Vq;jq$60Uw@yNK5JV30a=KU;)LU~;sa5CNU{ z%}5Gb3KsdmCBuW6ddfK=081uO%%4OIW$Y4d$#&naaX9l7j+RtRCqknIYT~fWSXE6& zx(^`?8ZEat9NUMV7?#R3ycRu>$zunRz3iONQtSajw7E}wXea!WVrKvbj1np4w01}- z8V_(LPSc1)8Ip1;eo>HGsPm*{=|2&`?I(G=nPVREa+rm!T9XoqrL>{!~#6cK7NWV%>@tiQ9{yzbKrU3JpCxiqf=pBEoTgI`CoI+M_vGQe@wc`+ zKge}v+(71KS|WaO)juVGv*NX+DRewKGm`p>zJ8Y#6PNcIUU)K)n-`~rkd`>Y2<3W| zA}ERsboFOoEpsVYSt<&(-1@)A2o5#Kou$4#`0kq_=U&pawdhSNN~P|a34Lt$t#PhD z+4X%RCV_=<0o7}%VTnizD8>2^DO>$DUpF?3B~IEDzbT-d=JXi{hTAjFp_8dRbsT7G zP`UbGDM9)4G zwZ&3Kv7et2RrS_;Tk)95^xW?`eNjfqI~wvBsVUJwS587?ZtW#?Yi+l zlP7`ZU8zT+#c)>By()V|2`G_^uBo66Nr(|ep{SOL$y7_~~r2V(`d~){h=W7uI96_XGKoRJH zxYiV_Q%6xIW+mmcebHPo$C=jvf|!QU8Z^)VjS};Y7V5VVp4C&!BQg3ZN-$I-}(MdDG(S0@snif!$_J z&*M;%Ek(|uB~NM?v}F^HIREI@rJi|D>&22S-C_ zT*gLE+Mp!Lss*YlGG=9J9v1FemZMZ#q+Z)?D4Y%B`t6?!N**!gvk!(-tjT+f| zn73_fhgnUy?mH|CqpUj_qNsE&u#^Q_0RUhK07hm2Y^?y`0(=t5$?LGzwN2fAaDlY{ zzA3gOB!B@&=S~v2B*`W3C;t0W`rudodt5WF{FzJS$HKQh^27JPS8>n%a{d2%-~6AC z%ai%pArG9%Lpk&Q4*j3f|FHWXnD2SMzv}&rx2xjHmGAr90Rvy;d3kb3?{eb&ct*Z= zRw)}!xqr$zM^B#a7mE1YLa9+J=+Iu29*~w%LSkd_k}2U}x?$dH^_F@HRZ z6Nt+{?lT|e$c?CuD54q>x{O3rwIGqY0tKt9vNJN?NEEJ18S4McFc-GSlm6$Co2Mg$ zw;u5pXUri}Rx^N(4hdijM-n0V&W4eqnrqlRektV}EXNSL2D-##{QW62edf$9#V@ealazKBA{|@tPLC+@2?` zN=dU069YKIR@OvZ(N(sf(cqzC<~g&dd|oLFjb9SINr~f&SWk2@R6z&I5^_{hp&qq$$#1Mu)CB~P!qq24)qA#2xOqV;jqHjiu4;9QRa?AI<(1HXi*Ck?mrZoi8 z5rh=gbQy053(Shj3TFEmc7)xGh?L-a|zqA!IL{F+z;aRUr zg`f@`ognIbb%r?HO4E2XMoy9S+yXhYn?EMTO^5Wr^HqY9QHxFzD)`z>jwzI^fGuRK ztO%T)zD4R4volJ;k|VkokUvRN{F2px5=3L)4n**7nr2m4nG5{!T@P-_A9Cc`=nX$?TDV}; zp^9==C5cOFRD47TgO=JQ$x3I|HZn%X7SzM$rS`1|T8W%Jc1Kk;bj1-jU2B?xJ1+H+ zK{@L}t0BBHh-;yC6PR^ab#YVWQ$DK}6<)qptRc-Pe51{$65eYpqTqz>?b$L=piaFBN~gHWm?wA+EF0ZwwlaB)3nr0@02y0 zk@OkFP>5CH@fB?-yAHY{T;VL=GF4~3+Kg=il89fcSp_OeT7xX3z;B?@lp?E98uQxO znF$aIvQ&&jQ{}?V!q?d)hNCk|O@)S7eVvw*>2VMsCncWA=oPY5x+dbHV*Fss0>aev zWL6P3j)`Y5IP1%?l#i4Yt%w)u+VPKZHgB*-LYviOY6oCfMQOUL{*DoQjIYR4gF zVTV?-{?=$mt zeZ_|4^fHidhGv;T#8OBBvMuf6b9R#t6_>7bsUEP#> zq$2~MYZP_k#eH#xb%bPEse2w0P5niNt$-OvRe)x8PSu4zp=3~0d&z+BOZH0 z)P;hFyXpKq^}{NJm2J&cR}0#@XjJt#A7j6W-b|tfVF#N>xlg&e`NW~u^s49A;zZoG z23p5}B>Y;n%PRIzyEh}uyGFvyR03IDU*Fuf2C3+&&MN}KMjZrzIA0ZGMqKC^0oO{z%tygLCL zNp1!j#}y!hxW6o}Xh*-Cv*k-V>cez$xgZZVGtoL!1s}sU5E*;)oB~ceszEvY=GL`C zfs^K)V@nW_(JO}eTNhQ|bj?b3EDTE=#o*c*FdW;DXi#4`dpKW1))MeHX2)lGY3Ao} z=bIU*9NUJHDTN3MCDJo?oPwqt=A$vevT(4wA*da`oybZPdtC{3C2&>Kh&vZ5C#q%= zIuaXg*me&Sj4HKZp}V+P+zKiBs67RU!yi3MS8ZeS+eb<57!sWUnYE!^#HLAla#BaJ z1ih9ixvB$7a@j0-s)5+r3@+-ehhg+U?M$$9D@ue?$7FT7?0#x}4Sx_x`SxuVUp5N~ zd5g0rQPNvZD%BcoZk#NZFRl^|!TKf=ir9>f96U#^nVa)$5fyq8EjqcB1d{#}kS^)Y zBz;YBf^+RqV8&l=Ms{jY`K}7q=y^kUs`=2g#~F}Z+ZR{?bMs~IvJxFju1mDP?4PZ> z1)6l|wS6}>JPo{v@*YI4j%5U+hq{8*{3EgPQ-6&?S8E42@5UKlvgEwiwFvGyrw3Le zImsl-wm8fk4OFh@;gojCCeLw~Y5i;xw@j8_o2sOtmVnOM%}(tdM5nGSRepdqC&lQBwbqr=_HCzY8irK$u8*Mc9>+@q%7#)LE$2jI;-EDJ666=Ms8g@ z(@`JOCA(5%h1U_d4>569G7&04ZTu_6z~Se}xH*GsXGF=4*kQFEZsnQ7I$YbW=Pvdc z6R3$0meek^Wy>4)CIwM-Af5T8B&;(#ts*6t5)SnYxY5o3w%CppEePtYwI`UGnUFs? zLrcr-?IuKOaL}RbD(qoZhMqfF_^ImU>`fl4 zlUAQAXZtGary}e5jF>8J4NT`(EdmI2*fg%%wXg<7PPvnut*wWsJ&5=Y4aVn*7Ah$c zX~xj9VpTQGly9w#ZeQcp*=)c&cWq(I9NOFiN##40ZAQtHS;wDf71niWz&UqsVHKC8 z*%c<5wpZo*PTDEZz`XXUuKiAHQ@lXR|;Ip!eZj5-CYYdA=!8-rM02s zE*nHjPf;;7n|ZQP(p6Pcz>FQ83dB-sKuq2BUf1j7b6hS-C@w$POku4*%5ZK~LRK<+ zejC~SGhenIvS?$Tho792Wr>b7RyjoK3tV9fGLv%IPilK`H=l;c>|M=!RCvxI>!xe7 z*F1vZ(Q#W9{bsO~ZZ!f-gH{fEHtm$nJC)C`Hiu(3P`FAm>KM^DyUSqJ+$df=9Zh*P z4UwEO16-OiAQXX48v{`_)ts=V$8ANxiH zI4ciId0)^um62J@#y{T2k87QcA)GycXduvxZ_oW585@P|L) zosT#9@ZV4N12o2M5BwZ`_B`Xwj-J}&;Joif6s5l({pjEW zpSr;o?qyVZ@heda5329^`yW_kthW}?7mFhNPu}qM_x?wZ$dHw+{Cu~xJ@Pk~u-xp4 z{_xPle^dXLc~1O;Z)VD&f9W4(&PqG}_g9nNzPxxkUMKXdD$1`)|BZ(p__mvui}1=< znTd{`X)`aGm2>8m({~%~bSdhw{*X`me?;S)oJPLqXFf%|5`LxhXujfS6w`X1`N9_+ z=1 z50rj9V9F1QTtDmi+q@Ou=MPbQ@9m#Ca(_JYg`&Sdd_R)692A@JLjO4XxtRN&nEi?! zM;UM=U%WCuj`}AT-b5oyf1+cT4))OQej6tN^y<9+|LJRZIJ6(~U)4i;nCA!buTLI7 z_9b+5`bz!O&qkz0YkmFrdfzC2;X{k@3FQ$2X@L*8>WqHq@ABoB8~?@m zFu0yyfd7`-yK6U5_r*2TEXE7__fz$)-WsQxT|X`UD~tH`rIR)UOPalch<3lMb z&;QAnr9()n-v6FCSPWhkM{^?=&6^7K%e*x`?SGprn!}%rm1*f|JbpR0PERS=Mf@2S`;~X; zL|1*}$B^{WpI-|N8J?WBJ_5umIkx{X(!{jN5>pNlB{ zna!LOISXx*jX>ma=+PP48^q0BxAXS-j@%+MS#15B{L$Y3 zsTJ_1{>tgHK?dggMTS@T9{WK`vcUU$g4OSNC`7jM4G($XXQ zAAcDSUN!LKzo$Qg|MgF!o1gqI{i3v5{a5~piIs)(^{kxk4IlR-3o9d1XKn8IMs1VM z!7OG+wVxjqx@;#d)dAw!0+J2zc&@gXL{G@`&tlb=C%)@B$YGk%ru&G*kr;}{{iML} z;@|wz<+z=9Q=2=xLg;K&v=uZK_T>taj(ZjHi#T`;T(F***t}Rz3;`ad*>fhV9aE4O z61;u9v6Q~g%qf0JsH^ZBNB@sHPdNhdUIT1y1v5>E^4POO|fEV+1##tR(W5hoZk zb)nV;7kn~~I;FjrBx70=*Lo(L8&xkA3&p|X-)BcVCYX3OxI7093<3Pm=o;GfwxO&; zo~vs+PIW{jDGtzqyj+N0^)ML~N@iO-&KWToYQLJoYOln7QeD7np0MZ&u?tVD4q?6J zKJQ}Lw@?^v34qE^qenc1Ug(WnK(KJW+fUXLpfQ&vBp*(N`yBJ+hl2A zVPo)KO@S-?!25o0Kr-<0aC~VDEDTO#6+o)hiMov|k;~1ZJOk+Wy|{CPuKFzW^E4k; zN9n--)9x7X!%2z zmw7s}F6n@=*ZQ?^uYB^Pejd0NF7{#FbM$Lpphc#m$)+XtLZi{Rg=g?6Nr!LXC%S4Z z=nXVfIA_{N!gn%uSB&P#ea$X+By{2Wm@oKTISwB89tC4MV1gwQYT4(33v13bAteIt zB?R0r`Z95Q&2XSm>6)NFO;DeUKKWsbM3x#DPmY)H;4f0HUy2{JYEtuxb#5h)!j>!> zm32O{V4;bgomA!H;Wkb_1|Ci(279aYw!V9FvOqmqitxfqz*Vzj&*rnCIH&kKRKQif zduw6be?$zHa}w*awnOIc{PKM099PwbQ0eEin~qkQ#Cv&uS!tBeOuZsKVrYHQ-(8~? zynCX!;WI3|3T4ge1f_eE5lx208-LRnOrl`vV<%v%D^_ z&m_-lG#rF*2w0DTA1yl{8Z#{<6_BW+G+7aq(@sUNn+JEr#>vNT?oB`{Q3bV8azpml zgt@$TE&RECJH4K>tBkzMKDgp5U4akf;@Egu5xoS!b7$z3?Yv6ivRU;j7|(~=r)8Qo z4lM3Zzyg1V>-G1+b~-X!>oy){x6Tq)v&JpFLzxfmdXf5XJd$Z(_hbN{8Te|uWPB7;xE2CI0anaV|6ID1T+Xueb|OM>WN+r)drqyA!G=UT)cqD87#zwH%vwj`89@dZQk;w@KD6e(CwiEFSgs z4Zvo0%DFoBI?C$Sp1wnSM)`+*-%=#6-X@!sMS(Ebmu=*Atk!+=-Q3KdsX|MbL*iz> zq3fH&#f63oEu5UAUOaw|7_N)Y5uJPh^fJAV3h=5l5QvX!l(|4MFds25i3U$47qiX# zJ3)*~aG<4jC|PA8R9zXONeInRlFCb@60iXxjH=abzoR5O-th zU3(QRZ6B4j(S~%g-EK<0Qm*rL?^Rr`n@kotr#5t<2 zO}J!1qsDhOlOMaA{;BOYs&90aZC+-Gy!R|C3yXp7z*#13u$^M#|7^3P^3^0#Oug>K zbb3zDmwgJYRH4HZcO4}9tV18aA?+fb3Dw}Njv?98^&l)`S&CG5V8i;T?PDe>CtX%n zDUp=qE)A5qC^o-rx3mtvxFE+AScciEG}1jXw#KnB}|W5PN1 zCM9~iWvSqvoAEyG!@} zCXDk`DkXKGzs)fZ*;>zIdoDCq}A|<`%E7YUwPpNnDQS*+9b!`+cL%g$ePneS!kfcg4BYIT^B;O4HJY z!uEkE7kRY1=g-O3=FMQ0^n=vw%zvQV{>zfv{0b#3?mtlVbm1&3AEouxc+-8U-v1 zav&himV^29pO>zcDnZy~Z8!BCNng#sXb3yxuOplXUh5PInY&B3up#0YrEZmKBQ z8!z>8w}z!cVVzW|5XO!o_oAT2a!>&mh5W}7kVX0ERr>T5E)l8Kzti;gAi~;41^~rZ z0!DzwKv9GgoI{3-gPRKS*DwYmOus8ZnVwjUfKkKaC{q)#Au>R6Ub`p>cXIe(s=-rp4q-Q z`ysG47BM)8k{WO0#vTha3|J24kU}=D5LTe%;21F_776cP%0F{D|NVySrl;!X>6yyO z`F0|J%zc?pLNua!K~KgJMpQJA6+WT+77GuV6U|T|Hd|0=T}kJM5ZuU012Ni>R!6lB zdLpaN&9)6NIMeO>*FDz0m4HA=Wqafsg6eb*SF569&4N~H2nkUk@osIrRvUNw`jqZ0_hPfg4gVcJD{X#TNCi$N}Ua2QjWM76%TD$$$+(6Abfn|k3GLrxO~@Q zvPDEyz0{%wp+zrWvWNj4)>y&kU4dZ!4LNtV>kZ}$h2;{C5gs)+&EL7k4o!qnP=-lz zl-e|8aZnkJ0}})8@7C{a_1Zxc(UUrZ;JbH^?AKj@G5NKQf@os{f}VuJaW3cLmg1BU z93Fl>4(2=Iut-YS4u)iisp}}TxYCqYT1f{GtR{YW7sjU{;}h=Hnp=p8j4cX}B$B2! zR9?V02!(&yzhG2r#1*G;)=)>4oeql^fke_8Nt{SNK=ry4w@mLwMfni zQZN++Yc?Z|Y;yJa*ee{xJj{r&0C0;mJKMlJ1@a*GHdHwfn}2Jsqst?AsJ_^htlQYG zH*~ra3ec8|CjDFr3P7n25Gc`j#Mg=imV7w0&pZwe4zB+Vk~B$L7oZ+8tHYQN$X;l) zvWyy1z?4GLpjxJ4=9>hl_PG@bq+mqZ4g~E)LstxkT*L!f|G+wJV~omMB((O~wk({C zxl?-WGn^OpT@>Dy2}5>A_$Z=C6BGELm*zaz~kwNJcnwVvfdhSuh>VBfi)jVM9j|s zcqrEyAbAW+0hn;#6&k7Oe59(0!S78g2gStr-p2h%5f}<*HRuh(Sv8?%G(b@hAsEa9 z0goT@%|X6cMW!W;P^>RsZ)R*z_E29i=!cPIr}Y%sh(}P}7biVHKRmP6 z$%!GDc|SNSSY;%9d@Y z=BQ;f$O;s`rszkic~ddnZlmu^0ihlA)Kr-;)%oE?;GqKLllkLUcbL}JjK?k5C9rBk z0hZP@kPu>}{cX+MzGJY(2=*eZ1XY1&+iO06)Txyv5FF;Jr|#UQRKte`S#(e^$zHs8%wN00kuQ#~|4o-GE?W zGz*RH4uXackohfUM54*A6)=p{kb$tQDfoJ4N~*yzmN>ZDyH)G5*aSXs64!zb34&82 z>VO^s4Mn3DnoC6Fa13WE^Q0@4X*;J2{Z z_|!cWxa?@pvb%5U)B-^P=3qfb+k{Ij#MwP?WWDFwrYEujk>uK0p zUmzjtP|ODS6bw{xsT%?=!Thea(I zgdRy-x6m<0mC7JXXGkh#6Wewg?F%bt~PKO4%l1V}y93cf7_8^9yR z!ocQfcWe+)OCTZm6|k+a4FE(yXhOzplwm&t1gyp}FO(KP?nxKQ|C61X$nuf>2N zDYYSQuV3Quov?B_I2bdWtQagS0=sn3s|MQjsFMr&fa=KU8Yy(L_nR`O0c7I1_*l3} z&huCdB)6iiCO0y5Jsut#XWkKn~a_j``sKtOQU@L^I#T!E!fBB7=U zAqzp%mO)wx94wJ7(L1Ha2sWev4=-79x6t_wwKg!LH4<*F$x$CQg_6ufU*jGljBB;y zU+HAQsLJdCRnh`HL8C%zrGjY>a7}H{f!w$rt`c;biN%U~!74|Px;B(lRRt-lrl}@{ zL+Z$cf<^jc-_r7i9MUn!N4ec{oO;>yG{~J{)4kzhhRSZn;Ee_iq0~jTz467nFj&DdBDq3S|a4;Cjr36s#mb9EJz&{4}?YmWh*mz)#AWB9XN7+^hV#P;7L3PiCS67I0p zH>pu~`V?@pLeO^}17CFaeKf@b246(q=-3WdN;Z#-8jSlA9o3YJfs=IVM;a|Bg4KnP z&gC^kRd=#WuOs87!r_Fj9fLM#1_Ak)jw_kGM8wExjR^{sXsd~HL;}? zqtYU2T?&uLjb7M&sLQzY_)rtqs$Q;k%n^0t5gocSB*3 z!WN#unO62Hfs9C_MAAGn)}2#HL=awrCBQ*eh+%&%dH^~47obGfK?8pSLe+rb?FWI+ zUMJ-O*Rp^pF!x2O*DH!fa}bb7q7g_*i7gx}GaCyD22w&q)GkXotpyq{gwRo98{p=_ zn7GqX*RKo-WKt1OXt|U~cdeLSGY-MZjt7#ka2uY+Q`W$W3~tA{01C?g%u-p%fZQUx zw(0FQY>%n5fh!yl5+bzrS$ow$QopiKV~QX{f#GXRwGW({7aItg$u%W#$wC+>Ss9$A zH{5w9gee!_zy@pByEGCL;T_T_Me|)X5hun9IUIRxP8{53KiC(r#xhOWXpQk*fts_~ zVX$ONG5bh4h^=4mq8Et^8^<@j?y#bl{j0epYyjX+&9qRdL`q9|zYT%a{PZ^7j`0Pe zu>Ui1u{Z6y5-)QU0<07OAo@(PkK3ebG{&cMZ`vn9;hFOXey6xAq0(_Gp$?<}>eq-e z`;FR1F`sgPNy9Vu#y$Y$m#{iY5{81`BKY>RK<|W`;pzyj2e9QbPG-ANxu0;j(z#(q8|K~V>kw2fCmF@sBj8XDO^9doXc9zqgSlAVxZ zC^_qcwL8;n8;>#lTy0U|>ofGUN#k{FvfrlVTjCkP-G{!v)qap-dYQ5&|UPp%0%@*Iu%#Yb0or zhLGTQv~)rwwfv;hOVSCg-1oQrSx*cSgFU$#_tx9^$v_)o(f+SVqBZYb+iG=G6dwRZ zhFeM{5t#uF*?x&J@qsw}EbX5laoeDNUSYk6IyP(A?g|Gc0FVMTq(oqCAui9p!rrqX z`#Nb23hKH&Yqq({#_pmT8sz%|Rl)X)noAF(y+P{~wjiSUuU~Go4I&Fk(^&(UO=wFG zS2#yvkt+#*mBJ%{#xqWDa>lfnT1rBCOo1S$|;SSfI&_ zUSwQK=+og?tsF!oU`sqJ~WIFz+ucgG*ORBVRm)XNhgCSiLWHyV+b*IfDWQ65K)rL zkwqB=4_xcYM_>T53$>trv^5k4U{?J$%1qTKK3z z*7Md9Y+gh5NOr&g^BKifXrScWx1~H68igsx zkLlu1fpjYnOPXCB#4q0FmiVs39nMYG)2cFB_YL^VlE`u{yjg z%hhU4xq7~1f7ASepVnQnf+A4*rerUuIU=u~5v&`7Pl`?0oI|^=kt+J@NQDZ!k`~(Y z^qZFZezs3sRoDgpxnA$Vo{&bA=5;RdWzef?!W}a%N#1cC2&`{z4%oo-LK*sPeImuQ zu&%cf;+7zgH=-hWrFb#RgRa-P|$;vyJ_0rHZgfxm2XD>1!G@7^|>a5MMUjxX~S zySRRwAgDtSh_G+cVE$bf-+|MZSW|QC-EUj44-7l|6A*)$Mt=g%{$V#P`IZ^TtzRuA zA&6=2TS|ed+N2qkVQjLWG`+! zfwOxXIh{~B*mn@@r{_MKJ2fOyEK(Mtw4F1d=#_3dFK&c#@Bs`=AQp$%b3h6;> zE>Mh#7=V%mc_U+GcV;$Qqa3}jbV9ekMm{%$;#%+2nq;}eFw9yq(7gL^9ErL-b5ykI z9l`(sQ_e%3JoXDrUWN=D>=0@O|3$nB7R@;({uiw-b$L zQ#BH8Gk~hwrMBct6vys5WNxXr`o+L^x!lZ96v;J46KaAmElCJQCMRrnN5#>tvKr=PV|U`A?bwgZbflu1`ifd z|FnY7R&!QH%_>qKA}6_e8E&V%y)b@#!I zl7Kp?C+TfN=u;@1LktE}BeBwY0}0BJ`W?S zyc~6Im#Cht=3x#;H3VzaA}>TgtPuoO-kFJbf!0W@m14S0pwR%KWw-y0)(}LvM_Z>T ziQGa-mA+}x%u59818qtth5E5dx_e|Fz<24o27T3pm{Ld^No}vk)rBig@d$$8$pvf7 z3G`(1@F0koI*AHxRHR^m27yo3iQruF#>E{XztQ0Qgx1w5qM!t|wqc5VK%l7igK_BFO0E}Mg+I45yH8$39WJR z{KXhL+0Y6!DVRbC!U@UO$fQ^%ZA6ehC!j)T;t&c>7(u2*L!lXZI1=j&F?}$>W>s2o z#n!;UgfVAx+YtSFFgAiZ6pDPg#ye*L5|`JSTRMq*#K+X4(}saG>@#7J4?wL`?ZHTd zxynl%;bw*!aTv(MZk9#XH7EcFT1J{{5*dbSyTQQZHi7)s#*t9V!dAQum8ByHm0qSJ zqES33Jm3PmVVDiX0+$E-Hj1Pr5+Z<8mal~^BA?oQoQ#EqEgeZCc9W9pGbJe|EtdTN zj-Y4wahXc%>0l_Wz*iV-004Qe29|;f^OyWloRBcRs19Wkx%n+J!5XTuRVlzH4ZC^F zjfLXtWr-+kYd4glvfM;L$@49}`Auvr8DKBl)ig^b(#$!Nc#%jzgR_f)IA?s+S}-t7 zd!92j_0mj}2to{$adZO){EyKoxB{EM3Bp&L(7`D$cgBxLf>df>wFQm!iD7Dlp4OLS zd`n3kF(%#hN2jget`qb|CC)>-fY7`OYQnu#Fj7(gs$_Q^x4lxsd(Da=SQ)NQ>rFV# z7PZ`Nhq;|nAUPrK-k!iSxS&BA#oU63*nns$d2$W0Mzy}j5l*mFmkumbM6~fZ)*wxs z9^Lw1L_*`!ks;_Ml|f9={gZ!~{_aEdUiZw-o3@}R*0zF9nH*z@;b09lo_Ks9M$mBJ zUd#0I8ZzX)zI|YnD<4vM(pEjo7=1R2i)_1Z=UrVTy-P zGDsn>{jZ_3C-QeF5uDL2LMSL^tA`0w+%Yfm7!4#OTz69l{UelX3J9KC!axUm=i8(} zh+G*f3PoUgw@L&&0L;G!rKGsP(q)Ct+}Kn_0SG+rh9c+zQ8K6m7>WgmLhA}FWks%T zOGwB@;CeSogc$}_>3Mz6pj}@cL(?+>$Ql?>?^_~5yig_ez<`z;X!A-Y9Oyy{fO3eu zsSwED-HA}ALTUwEDGEg;MfNZb1g`bs)(2vF}(iM94?iWHE7xxz{%uu3EVzz`4v z00jUuLqs(I0AEz*D0YAVnMi`XE&j~X?rH9=`MUyU4IBL)FpW^iMquREzs8*|ma ze}mHl05mdIL;wH`V7sYfdv<`t4TZTjiD^utbuy8E+^f zZSA=X%P{+A2tc>@oz$1B~lzLdI&Xeul9`g3&=Gxca?booXk6gob+~Qvt z_JM!@c3J{Hn#162XLEP;zPFzG)vBPU4*#g^dl&~Jx4*wS_FTgw>+f!fxZN;bUtVD0 z+uL1kvvX_a;?+H>&kWs^t0+pSAQd(xSP3J_Dw;;I013c|itB{#VOO@-mySaig=?bS z8(kFEq1nYX0TeDVxg?A%mLig`GabI{?Gv?%5!9p+Xcj7(3baY*Qff#vwoHNw4N)c+ zAm>nV|e`%&*Csj`Ztt`fl*4Gk_FW$VC&&m|D!7F-nw^B(kY>9n8P` z2A<{pO>B=rGxY%q_2u~tbmgrUG8BCIEVG}N>&q?M;f-J;!KGE;pi1)ZR*Pw$$q(cFmM2xgMiGfRmqMsHvO-<0{-XkZ-G14}!IYN=h zASFpETj-$?nP<~a0|->vt{KDJCK-jxk#N#F5mJ?+CasthZ7TExvQ5Xb#4TY}CL&RF zc^Lp;K%c)F(K#(UbfU!2M75PEBzSFFXvwtHsLZQ`yGyEy7%TVW6FVHD#4;OfG%F;n zPe*|?QXLyLh(wl0nO`9ajlXpY_xWTRMoAJFxNduGvRPKCq?^mIw;iZG1*hQIfE(+MY`#03?1%^KihKhPG(kWqXTxG$ z+q+b9CCy4MHGp#ppyZCn&~m%+ZxaeGOKaYzZNu9!7DQR1 z0f#>eS1ytrZXVs(YK|&{Ew+({bS^H*6FItc3_;MW<@IARdG*H%V#oUgUbC9okNe&3 zqq;YDs1YVAaDYc@CZ6J^k77QSt?0!#{5Vy5 zy$s8cM@$UnjzlBZK8}h87Jw8jFKN6L5b%pOPcs-~^1B72H<=wN?rN@YK@mO5&WS|J zkSfDKA0GF_ZF5BxoZ4Y0I|gzB@z8y}Y{`0ud+$q(MIZS}(f?VZu$D zMP;N{1>6JAWK9rH=Cp00LI3UkFha_VoA{|{>Umt5A_PgtOrvFIL%S)1TfvD@GE&z% zF1<)Y452K4#aCHZ_o`){t!0<2ML|j%)Fw{iC)5u)Rwn?Ub;Dv?K3fN@N>J<^-@FjO z&{qtiwx%(9L4I`|?~v1~fMT}Es?B>08TbD*}EalV)2Rc}4BI~L&;`5*$ zw!uECKS?X4>{LBs_0j3`QAuduavFdbx^am+x2uyB3SRE7p9B_Ry>JO) z?VPz~)l_aqff9;$QnTI^Z(W5zQ6NlpyQ!rW4xxnyCMv?f;C0ONjxPMSBeJ5M19m-8 zg0M@KZHs9hzl(4V6e{@X1VY11vX%Cotuvb>l3l6Ib03#pRhO#V9k)q^NkUrw z#A(SVU%0Wvz>$TQm_ACy6SLYG%!rkXY@|YRP^V2h?}7gH1~RJrMr{ead9b4kzap)D zqjG1gYyk)*6GF+~=P*Zr`^qGkJJot79vdz}RaQlY7!AsTPP&R5HNT43ekOw2JcXlT zxfzY;s2uL{Y@Z9{T?Jw*s6L!EIt~TwrP4{VtQvR+S(u}x*BE+wWfPia+1)rN?F#7ug}pc<5ZW> z==DqX8*xL}qgmc6t6sTQvbBXvbWgG(a_CC_!G}xWNY@(g$Sz7pbv5P8?F+HW>=0eG z)Gd{m>*vzKO_-UcH6kxscJz~%CPJ|(kSvHG#Ay6fumlp(bO7-Ye_%wycx9^jt`(tS z;3yzO%j$fXFtg+-7!IRVC`n@Yr-ZgbEDFH&0#1E!lUUaI)Jy4Gs2N38wl9%U!hc*p z4XId4|H3NeQ1g|dtdW)PHG?-Dv5>-Oc|f@b(OH>PXsl=q3o<>Zu>=;Q0B{ z3Vyl#pYfj8x&5&C!@PZT5&R+%i?mqa(~{|ZLi|kBHw<_=Muad8F7+qBqSTiXwW()& z6NBdLrnmR(q#FiYR@iFZ^>W>2U0mzwcVMQx!NgS!49S-!)RwI5+0>v!4f^`6MWz@X zvXr~suy=3RaR($jZJK#+p)(OnUj5;gkDrX<4;6Dcfgv|a+H-q*zDgF z@am;PCqi>pUPhv{u)vDe#0_LgaT8rC{%>f^Oiw^o(QaD`4_-8}l77<90>qE4hD|FW z&QQ;@18FJA&H~bL(L}WgFRnySlKA7WvVfJa0vIXDM0liH2}?(a3nQQ-KFwqKu~q${ zb3!TbRXUEK578t-rYcq6pLPam_V*C|Mg zm2)aZW+j`7Q|H98P4}TMNXQw4v!_4^xyno>#8fszvWWrN$3p{CB}y7vLe$d@a^Dh_ z6XeMS6%o^dK{OPo*?30_Fo^X%ol!L{qujF3G4LXWNdkn$MO@{D)6jndOa-o(%0ru_ zMCTG%>8wRK=9pIam%+hW(__%2E2NO?Qle%rqVYHlN*Gg2ygfX;LjG1Z*b&a9g6m<# z73g=f6w%}TKpjrxz_bFvd2DF}JE5WrGO`LJz8OK3jQNFIhiC}N%Md~$uV^VS7s3|>gF_w6 zlspq?c5?txCq4fny#Vr67s2*n+b-ZvPVLli)mMf1PZ?T z>0%fYBckf?lOuvbUjo(&2&WmS(5X^|WH=0uYk>N-ehSVV;ER~hVj>gZqVsSXDO2piE! zcse%j&=^p4M`rv7(_C?7g>n@ez|-Xm7K@g;ZoG96NwMhnW$&1D(h)UpoBD!=u^rrAG6~b4t1Scn~965J&OH=--X4A^xdWUrxx!gka(F|}0B8foL zSDiFv_-(@#Oqq7gzBQlM5%!Y5$TX`u>uG&;(mEO|#HJ3&l`_xO* z$kgnVj2 zC8m;jLCmkl)ehpI79Zj(K+|VFRYeAIm+4Si;#EMf8D*-{*1q@=i7J_(zU)$p%jwA( zFkey|+r1N2OQE}ObdkWR2~h03vxSEMlaQ65!4oarAcfF`Kl>>4V2|jvtE;@ZVK3?D zma9%@5T0@`J&{P3=9HF8K?zkZAJ-j&3-aB!<&Mu6)pX_6`u6(EdYeHgYbI9X<8z}D ze#0=IR9}>p8d^!|2qcBd-lggBo!zYYU4{wWg3{V}!$t#^R8h$*(eklNtXCvHs;&^! z(w5EtAF|B3)9Kk4LdSzK zD9rV`wxSW7mk>sW8lz=(r}AdYJYzm#2ghIxG+GEgN%qT&pmVmsBC1 zNj5_=qM!=Q>L@xx%o)vmqO;~y5R&8Y6_%DhBX>$L*qs;8MJ#hT#%r0wZAk0~FYn{J zUtjFJnn|p^YDMq$(aFO`A&RWOif=5h#EamcLENPc+QkkvOQPvS7%=b3gr5RS$W%%Y z8&R5rnpX%!YX9~hU67JBlpx}TE;eURx1GF1#9hzXdZqDOsiP>oH)Q6cL1`phrYASB z=Zu0(Ny*k=L<~~2-m}4hqes%jskY#Z>9}y`I-G`p{6D#xKl|5p)*LGk`DjrZbJxp? zMmE#Zq?d|BV5OHWMH1NT! z;v344n$_B(*$@8fO$>+IWoSSxqovZcztf@{K$YRq?%~6|NB%3;5=6x$a&6rNf*o}* zy4-3b8fk6!?@SwXSyTOsG?V}9r`&o3o3Ou$N*vo;tp z{+!wtOVJ*j*w`9qd7ae#hWe$E@~Z3DQDvp|yPh9z*a`@%tcjV$A}TJ}jES&!i_AtB zZ8hF^-eopypH^Gan90)V)Ip@5A&!Y)ckV4z>8h$;VQ3?wt}LyYNaTgkpoLDXPiRI9x>r`+c(Z9LC~nM%Y{2EcO4k1i zVi0%vN+T!zYKRRA1Ee19ed>6K>z5!akoR$7kYhb?+wg zr$#GO#K$8hHc=^N974qzOePQ8)Lg-%Mgf^9=&V~y>BhaetKcOaW)>8g+8aEJAw*3N z8wnVWIk$Usb79?cLR*4jjUKDS>JGrvY9N8l6+B<5bSCyhbjsvoZbUQO@Rw45O(XxW zfUo}VpQg8|(jq0>M{8-GN6|b*Bkl&)5yiY^d$uO9=LRO=pXbcwM6}MYdyL{UQTakm z1^5g zc!Vr16Sr7h&l#{md_Wlu72uF=Dg{&+@alSg z1wB;4+fsoSxQRw6pwD`zp%gKx0xW33en&(c?WE&Gs#XI_-Gn`ZCGulS(rOfYQEJe$ zmsusVarICS(FbK0qXga+dJ>V;nG!j?lsfgSrB4i@G181kTiDVXYhK{ha{>4xWx{9L z8`?%Mn3t{nTq~9AmEZt2y3oGtLNsVXBCR$wnby*4bt+hgvd~H$PU0UE!WIlYS`IVB ztmgh^9%q0B#Eq|li!Wx@kcc~6kN#X~*Ftc7PDJ3bSy6MzZ0kZ zelD)mb-u|MsIN6a=Hi^Wc9O3Y`tKAEJl$wm0p!=`mZYODk5X|92xu0fEV}DUpBx9G zTS)NX6393#(1R4=@ZkH>Os5xOdxpF`rY1{a_9(h_vyqQ!3(tgS_~aY|NF*JHy@iQ`7k}jF`};-xxj<>8#lAbwe#7! z($_Mv@wZr}-;4N5#_br7m-h>t*XSF(*5Kro`bW*$D1M&jxoWw$;%)mY+@YuA#jMiY zj5^ae8;|~J@!$|n6vplYuUw)~KwZa@-(=Xe?Aa5e{C$3dE|^hHZ|{xzzkY>#X0EaG zZr^3G;jZicabJtd`mr%2aoxIgVM9c6EWYE<{vCDmHa3_gx%(%&$!}}C*NvtV25Hq~ z|1!?qc~Y86TyMF?lw3T&cX`k8;FOG)zwh7CDR;+)Wo`OxdmG+3M)mI7y?UjcZIrcU z`mC(<`><^rZ;aMuZQFe|0p;2nXSv*8254N|YhtWDa_=3&U+T*_#%-~`@A$_L{0D5E zD}Js!l;pF{zaO108;<=EI3*;_VJx6`o17<}sP5gXck914Z^4~tVY4l?{pi;F^qVel zoHw#F0`a}I?g#6$VvH{x-b<;o?=E(qx0~BGYAvtrxW;9F`#5e5%&RJ3xx_NYEUkfC_#1G+* zdCX-{0TI(r~u@$L2M+=}+#I zip*{H?1&hA3Z@YYnHy^PiOe?~-1tajd0ps_q_R7za?zK0n_zr&PeZRN**SF7}{FQsN zkKI{rW{};5eO}*>iLv3cqAw`pzXcX{yZi6Uu4$aT7e5qZ+!%<*_nm)N5iB3M7x!?( zeb)YBJnV;g?*#8x?;C&fOE6RCR^*C&8ALWByjCd2w%>^S(!Z9AA0EiK_GI3Of@HG} zaL1GQ2ENl>TwnwD^uCWWzu)xr*$t?cftj8x?-tss;|{U$-u~Vjp4R>Q7O~Sca$Ue@ zr=rq~XFp_P3=gNM-28yC5qsawO~iAn8}NbYjeQ@6;zH-}SBDOK05ifp?hfI~wh*`3 zUUVGeeiq~R2YVC!VEzuBqGbY*m7y$m_Dx#4&J{bv8Ly1lJk|$zJTFLzI!f4}++4=c zOW^eaVvvG@th5UEr#%3?I7p;8Mp3hR0AIZ7=hki@m z`&;Kn%72n~zuf=3_nTsZ&)Qqr*;{Pw+qO*`S+DeN6|ClSjYO}%$(0i^L<;A#7uBF{ zhMw=k2B!3v>hBkMU5%L&AYAE>#5I6nS= zvscD;Vd6x%w#>q^;E&#k#EG$J!9gJ)%y5>|c74s<%qXtS%I4U~sJ14V!_sxZ9%htW z%y3iv9xG4_lO343T8|A8ca(@&KvI8zD0UffIJe?aHxXJ>y_av7rl zqXJV9S~@VVky#pq(vBU&WVE$VsHvIuv&EJeqhu-zCgCQSD`dkXJmeI)c3q7Qxi6GM zQPyNJP_Qofs>amj!X(oOp+v$$%!pUypPLXwOv>5--kO;OD+3Ial?lQ`%E~JcU9h|{ z0W__Z6BSh!$WF@4WJCZa0g@y_D9bErRi`#w-k3oyh+FaO*vKvqg>x7d1rtRQ5QxGo zGU2qk06=9@0AQy6Ng)FeY+t~1qo?1d zcRtnTIFu2JO^L=+$|wn{7ACHjupk>Cd(&u4Jpy<;(Tky=H4#V|Qmk3n{9Og3Ia$t$ zOp*{N{fN#ZWyJDh%Q35ynn=~Ib5(q@mpJMwG>oQIlz>Tv5mm3$Q>O~Sr>2`@{Z%q1 zD9gC42b<$GH?``s z;KoyOo}b-l)c>~rOvy)TTQ46A+056?9DOlO)f}TrEC)Z*Pt4n$k>4wOh{|yf82prX zTD-PW^o@1qyAeUUJ(WT8-_~26(^VT-^64K#d|lTn@A{DYd~B}`1G4T#*&`FzA@Lw1`ib>Du`qnR7~nL` zwg2Pcc~TgX{EvnfBhz$*3oz_0iAP(J<%zn}SQ({DfS-yF*--1z19 zB93-mr8B(We`Nl!#ubj;hGJ{P%qG=#z9IiOhS~e@8xD44e`Ys-9^avyeXqd?aP!m* z7QMZS{S`xMc%;pBFY!o-FUu_C^L+epP(N|+I4}JWtzVR%%W=!#QJ+b@7pmYOU0G!MB5x} zv|+q|%)=|skDczD2j%#g{SUWGruQ){z>k%uD=t6gkH)*C)$A&XM|XG4eU=_gcnpWdy28ujz1&({o*8ix0)^ z?ZJF~S^XK_7|mVW){`yyC2k?g!x^Xx$(AHQp878<7wB96ZghQ*^T5w)UgG}m zUl=jsj{kV=hPThP`|#7VoC~_*vQw=cfdi%xD754MIHB4b+Rpq?PVymZH0QX&h&k5dCSyJlb zoU0;EINzPhIyTQv$KO>wmi-LpoYS}CYtc@cP%oc0q;U@1a29xvoryOd#4X}ln(v-X zP|s}{{O@Ps{I@?d?le))tJ+C(<@&P7LhW;_Efmf|N~(>^{68pw=H&zbOgPIwai}=X zx}rD*Ye+@Nq`tU>KL}yABb?j+jx*f>7fK_`u%D>0w1odpA1ewt`@Fksx>Olg<85m0 zsh`gCb-k=hrg5zLayni6sz;e{YRK~ERZ1$nz#->pmfH!JXRlm(E~mRVy3PsLi$+hF z9w}jo%MR%<&x{rIcY*&3>~r!Zlp(7ItsvvSoKeQ`R{OpzXAm*{lsql^9G7~dTOEQ=FWi)1W>Ca%RM zAksERC7l(L+=bqF z*vHz&cJ4WQ_ zhENm}vMlz2_DSrf8fb*agG&FkMsLlNyzSR2<$Vok6Guv(V!(3=l@*`{RE9->T~f+a zuo8uHIc2Kc|Im!J(GT51+m^9$>$mo7MibxSXJ_!WP-#+fn%f)?D{-yl1U8A1s|dTS zmIoj*iJZbGv58$R&_d#{-v?`Ly4KrnBI-Z?ZCTsaHtotDqDx9qkpj2GwUSU(tjxl7 z4+8-60f?!DFEiO-5CSYTfk@l;ZCloGO?$V!Q0TC92`CarN}gHQuw%%UHf0R{FBYvb9l zu=6JvTp&41GAl5PR-tNKSOVdq${`9OHC3h7ELdOO50vA)Z5W(?LBYz>7f7ZO)kph%CM+1ir7*m-$sD?e{X4+-9ar&~m zk+WWPa?;)8v{PwlQ#TszO@_PF3OrK&yuDk0KI@-o@(%6($XUXa`qu#Ot)8x+?|lC> zY|OI!O}umTW;cWDcWO_Lubf>OyYls9pWz$#)RA8~EHza}oE3)W)AA)N+4eJ@rqK%O`+r+Yx zRj!6}lT^kEhB6FT6|zx4$Ap1gOy*|Jzj0;CX{v8EW5Ab^C+0&rBOCQ5}NhLx925G(e9q=9T&Eab=wQZnKY$!*SA zMmDZe3bP@kQ5jl+;3ZsUYO?zFl7&7HGsz9plL1E>Uo}j}K+6QRlBp!Jfj|OP4#*3u zgbk{MoUDzi%TSoswsw6W4a}nvMb($@Uv&NSA&%z`m_61XM9>pgN@5AtMNGhoVbYo@ zuZx^CuW3+*3P&a2A`1Yl5FiEsZQB5{Lj^Q600dP4sa^ojAhBUXRnEVE(r$)LnOxu< zk^ad{v~3RoTlZ~YTeP^gs)GN$$A16_j2scs0GvPp05Pb3eHMX;#B0*J^ zVd?aoQe7!L=K01>;GHyD5s<}m-I z_kz0@|BHbB%drwWq@g)#i%{w%G$IqlfWqM~{&#FkbIxFu)#yuipECW%cQxnz%tgBL z?=2^O3B&P$vt;JH27l-O@x)(x#utkIe&&6*A=c*6PJEe#T=RFs&b(FkCSCsbqlf?B zbv=Lh?^WcF8oK_3$G!g0l&vej*QF!h3R+tJLw66-qZ_@d#Y6e%XI|3D`RYwN zcGCZouS-W>;X^;eY-5aEJgH0;d+3l7KrCi?-eHu0OC&`Arz~CzElUSrq@S_}SKCiQ zlLQ_*ro?JwYw*>Yn8F_{X<#>{Bb>~Tk?M}DV3C$Rnc8@AnH=`eBPG@` zB{ZTg91;L0(KIa5vIkq+wKp?meE+A)gwJljWT!QV&y7`#tBK9nHYbPEsYnOM3yh@!SXcNJkzpw#!@RU*>Wu(0L{G87n(f z7DOpCFbJcXg0*cCg&W@LZK>=5!FJZUm-Q&iXY$lToRm$**P%h2?EzM??TsuTfEtu* zrTqp0TlRhK7_XG-Gl}k@eagBe6^a|cKpv|B)UILPh#iVc5++JI_khxRpWip@=FIiS z-U7jj@>0-6SduM^s32>T1op8)x0_npjr%nj(o`MIu61ACyHh7d9I7MP0}U)U>L zO#x`w-6M!Ydk;f9=qmY1wn*v*;;o@hs_H_n+Wgs^!HG{C82yMep`;$E1Sh<4MIfsf2jy9cbkQ%`Y3 zX=V=vUK%LtR?Js3nWuLf%;1|j7DX8XXk2Yc^Mno*($TN$0?{3P>?0=yf2nmsk90Oh2~c3@c*;X z)(h1R#T7y2mc6duABhP?P>|*B2rQXgbCSWDS2NLvvaAk>&nz7#-j+mI*&D5G>EY*R zRCs&rc?hDk!lAwtJ(vy_uG%Yowg{BWO6$c zNJ%P&3H%6&SUHmOKJ*8=1UCy4!;Guk3EeGwJ=H~*i?^v#;G1)46t<*uoW_TODR<#@ zv+%#B1_JNGaBFoLd$_`tV22vl6#5>}qQ?r2Z(W(4IC8&8cr}zxoz4O;;-0~m=hDm4r_uc93BnHrQU;;o z-~Js7XtE|o7!zWe-s!;gRA}kDz$PAhuZvf=lMLUXa7qaBf|(&nA}E4@uaU#+>H`jJ zl(mQ(fJip>*sISqZ>PRp z%_8;vpyG}_FKb8hEFp)2DS;+xW>LZ%!gBj|Kt^U$=$s}91>%y#18U&dCbzz0M!?yC>XfQ3BvecN&L zU={^A4i79+$vbt2{IGU?Zl3+2Mm#uOH5c6Q^bMdR%ig%NbRns7R%BWATxjv=W#uSH zGIwy6#@Y7>qw{PG7!DaqJ7zQs`7oh=puQWlJKuHix@^9AYXy1y%nge7R2@U4511ae z41~!bZ7~o04HB?r*~YlOc!Rz--FIqq z^u|6v&C&6xY4noENRf9al#;dH04{n7>kWZud*S*v2tU6xHe7)tbV{)YPrak~f#b-r zbtsn7XA0M9p-e>LP|F_#@NsM{QhV7ekhI>QzsriYRQT?#`dk%yqi(^GBsn`2N~!p* zxB7}uaTOuen=Lo{w`>yWVa86}2MoQj;yc2D#~sq-+;#YQ zNO~59tEAHDKSNV%?(jLF1iO8*+rX{Si|D>;?J?FvvqOTE0NFA;GO@9+uqihV9N;utEj&S(J~p-@dl_cjhr%z1 zaCIoc+m7kTwLb#yjR*J&av>XSu?Qec%iccAMV_ln{x;G&f}DAW#3>s>&(;4DtXV9T zI}P;6XC&aaY$~Mh0S&P4uBOWq{Lxs0qpOjTd4uiTPOjh9>4TUuE0RzNuVLdJnd3P? zys(?UJ8n8wn(x>HJ?^2OTb(02FFT$}p@wsz(YCuhn~v4W@RGBkgu2^#B*sH4p*~)e z4oKY=X?wsR|9j5|r$TnBQ^(T7&duG;gYK)H2({P-BHB1Gl(b?qrx7C_j?i}&t+M*a z+~$lyu?O$GwL1N53oneTCX~%~1j=Dgo|tas0GdqUhp-nDgO!z{w8X$GVyV~zhTyEP z8H>y(uI;1<;L~`rzBzUmB_>-XQ;tK5>85>vkBf#^zL+DuVMDECZ zV-MFnu8r%dL3Z3<9;i}sI`r|F>o;I!S#=EHF0mS-DOIdU8d}8lw`G& zL+(dj1M4*jJIy0x8aJy~6|O?4?YI)oK-?RIciCHIscX|)O#JQ4xEdwNZ>NAQ|uL$KDEp$+)K>-)hZ-D#C`-m#Q(cAwPW>UvV@oYY%|J~%PJIu^zh$*T{9Nl~wbR6J zy6pv)X$V&E2wTILAh|>#kdP81tGKX5#vZ!!Y>qf_1v$PB%u;|crn1n$BMe>EyNGXe zH#HG&iN6#b>?b*H&SA#S(NR-74vHj<+*l6GXxu^(98%!bj9MJbs5PnJ!nfak2E5Ny zQN}#4!Kr3LgaWkxD$I^;w<4qsP3M;C8@n?PpsxWLczuk``)Ji&*8DPfdCmBcC`@(9B?xOHbVSOAS@dVtbp*#qWp zXxouvNaS`Xmoi3}hycIA?7K(Hsd6s?5f}mQQ^AtzdhQ(Q|ZXhsnQ&i(@{{6rR@#-uH>2$xa1)W(J+Gh;KpaH z5prsA9#AC5sdW)}CdGnOZ-=@mxUX9R6%_TEx6YXmTLjmZW!{b#}Re=w9Q2fihZtu>#Xb4anlfN%N{L#+#2USo?7lk5=baW(sm$|Z+yam zC9-)1v=|Mjcw&P2Fs2rl0nNAUukkr1|baVaKfv#>lYy8h^yDk~JNDps`O2iYA45gV_ZL?C#pwNyz>`40T z^;sNzt9?8>%e%HhJN;N6A(n2vjBo|lw5`P^${l%o-BBL!lE=JSRP4tITJ76;u)INZ z<{AX7hI5FaE3OdQ;Vj%cawYTs!iVjCNOaoAQ?%Ff`!8cRrAp{AO}1u@+zsq$g2FIt zbsUEPC+!8Kw9b+O_Zmnp zYG$F@!Oc-G-~CPn1LEM=%6^}xvvWL$!L7JMR5zdgw_F6XV-*Y5k-}-?H-p6WtK=Z? zk3H2B8oc+Jn?3s3l3&1&+#%sF-KJi`ii0P@7TMBBiozS~qQnDU@z_c~Tb<3G^2`*s z%S14SMWp~hsQ18%2r__@_RK+uTP*HK-vgJK`H`I=^~ZV76^+-u^WaK+!_>{C8|%Xk z&VSb&)#EZwc-osXuuzCnyn>yVsDrsST4Wn_?YLo=;1I+h>!}hk%{`y?l97oOI#BW(9ptbpbx3a7$j1hnU0Ly!x z&jFak11A62zYxBPW8qQ242l%LU@`JoT8m?Zf`i*%g0dm2Qmhh|JFrygd%*PC<(7S&~alkZz=>Z z0EieEIAL3WyvjuYZWsw%rnnC%?|i2Q1LiL$Z~YHG!FQF*%r8)hW$ig2rpek;dt`G* zCdS1c7_M~osr9A61Gehe&qXi@AJ~_POP%qPX^A}BEfMWYtH5h&rTQFTtYUk3fjJ+v z+NKPuvIqV1Z4(f3LL}`$DN#dYHG5<-W zq1OvT1I%kBw+gHu3SmWogdzF;g_q%u^#6NTr0XE$olNJsj=&J`J;hDkdqbrjo#0Uu zVTM#fR_}oDI`(*y6ZP==&?5e{m&Tk0*4i;=`dKoPZjBx*%$K*&3{W$PF_Mt2y#^phDU`2emUJ>rLdKRUomQ2)$5AIZ*&(@2dtUjlZ|A zvXk@`Y&r$L&|>W#fm}!($akI3!LuY5q4pxBSHNLwC=(ecN7!zgm$tYB64XDTvVP4Q z5bN~X<*I4tv+}aOLT>p5*xLo^`$Jen=fX%SrUP065<8)~N)RfJ?2NGoCi#V_|09YA z5%v)B&oc2XXHd9FyzC|^M5>MFEQ5Q|WYtVD8w#e5fV4XH?2+i9w)@Th==y|QQw=!F zYv>J7D9#3g&;vxAwCXX~3sC%dxG}iu59q05y${`reJ@Y_-(@81AmpBM$6U!pgf)f< z;L5KAy#UP4EJ6xSw?pJ=x2ZoNU2fB||M+Ep3i}8-p&vOQZYX4XPCx+U1)pN#)H=o= zJ|tQ&ZKzf40n_d7t%zvdLXJ5IJ==7s46%g*Mz@)EH3>nI;ISAuL|Z3@D8y{dF2&%8J;@)K10J^E1} zSkw-!QlcH=KtzUuR}ol}Hv-lPR$v?^cGf)Vd%%_JcggX}>DcHnT))>0__Hk5hi)ld zRw;tF5BD6@_qxU)$SWn*2oLi=ci|8C%YG_1;h$Pq?ZIMkW$4RNYyK=Ehmt98ljF{M zhG<$&DukDd-LbQr@%?YeJ*W02^D(nmtO{vDP7H&EDtq zJz&X=CkG^^9MDitB-VTyd z3csikaO^+5gfZqLK+~J;xYmjZ0ZF&)YZpiM$mcuMN{PeJ?Er{SiMF)v1_&|hXzE#S z@x+rZ{e-lREw;QID!fwZDmV}ImwA%|utSiPEqE9nS^RQ{f)N3lNEiqgI}eQjp6VX3 z=lTKwen5f0esDIW`t^#>AotJf{`8M_e)PWYA5t(_1kzT}?9Z(%djO#ju7i@5Hw_}} z0Y7Z%?^@9hKGsfz<&r|JN6y_699!K}#wIv`yN-ogLv?&aHL(ZwuuQ>Qp0OH*kB~6v zIQ43d9NaQ#B^HjK`z0pop;kZ~q227*M`I74a$bF}?I!Kkb|CD=f-kJqGV_*tW%n31*9nmwtZb+1A2fDh!Cu?JvLJd zwrtt#CYFI=dVT|d=}C7VGC;Q0N&PC=){fstwngKc9v@+18$Hj?Vv0KL_&$=TI_>eE zv9UUKnjga<8<~a!lW;(QVE_P`5i6S`fV+gXXM!u1>IoBdjfCPKo$ zFe7OM4nzq;Cs+>Rh-pG22?&i7I6~vvTQdLbtoBE-Bi>!%VtDp=7rVQRo2(lwTntS7 z3qKs|U+h&+Jqf7mfla?7^MV^Z?r+HNu->@u!+t%pP0BaN$2#nH%*u9F#sf$18;W;= zG6aSi>oQouEm~S+v&x|eFJGlhS<5uv;_hk-*Y3ravTxw%vHtrPIq+G|!5_Cb78$wM zY=(h|6DB3NG2zA}AUHul;LchRZpA0vJL^r6pOqWlzBBKQS?xf>IDXmBxwa>-onUiwuis7wW{qidP3BDlH`{~pV)%E(tt)nC{ktajU5BXM zm)F&Ql%29Vc~f4(*=EriQ>mrV!W{b{ag-R_8`Ql^ zxA=sSk_~A{Od*zFA(Gg6W_?}_A05f6B1J*KachYIEqU*}y4|@U|J`kh*6Uk#sS;6! zP-#Of688iUz4_@z4fu}`+U5aHdQtY`+*->I7=L1P5*M@aM5-YbiMdWQk|doTLMS1{ z5hAoBt)prUnq@6L;4tqVyMAHrE_L$m-Mfj8>n>yd$!Sm8uxUdi5;@I+Tn?ORNSy~^ zib};fka6Ut>M&G$FFV{DyxZxFs}wz3^xfT#S%WegvXKaTW(6aL0pmm05*R{iNI*FM zn4ceKEj?iFisr2yeC5TU+=lcd#+DO$+R^3|jw&c>qX$8hXgp%eT&fCyZOZp7JX}1x z8?K9m`-_1)g|6@K^qU+ch%q)qAQUFdZ4AIZddwGRMr_ItLs7n*@4;)` z!lLN$xM9?EOXcun2N5=@A)ewbPnT>Cx3hYb2<%k zO;U>2xP3CB5!Rh0CgrhN&X#!~3F62~J*KP~+?4P5Yj@3$TZfRg3R^R&IH?m_^LyN~ zd71U+T%!|0J8S(0sKIK(UII%__f0b;){yu3n<|fKV^8Pxnui()xXWAOqsKT=fF#Uf ztxzbkgu6UiRS#(4biq6Mmbb2{t(l%w*9`63+pBtyVBQjLV!)U|VxFD7cCdU;(TvBJ zx(5;xA3mSu^Lg5CtM-6!DB$Pwo6>Ko2JYUrx2@~%rY7OHO-$f(T(ldXNp#5Q83UoV zwFzzb@&D08May_^ER>GbtibW!dncE;5AMPHIgsvk>>HLJycRGqzMLx-IR{|QN0h>7 zAR$Dt{1xKXf(+OgVO*r7wf2CQEBBXk_zLilc*NV+j{s7r7(Y76m+K=R_yHSBN0}qD zY^rR4Ia&5gQrj`jZ|m0IX_^zZ_VClq(%!6E6ttkom`fra@2`C5_}v^EyL%tsz()RE?g)!(^8D@_dF#&Ic@tY!5|A{+<4A=$wgnNFV93^} z!q@I7nVb-Fgwjn&tGyR_?s{?B725W8EIb2QxN%5EVpqo6q2j_kGmb?>8a@U1rf1IH z8jGrcLg)8Mv=rzVc()UrTism_-s=?B{jn&sK|$mMVj=N~xRVGso&dbC(14)lWLj0Y zg$hil+ol}ST6@656tbV}IoyzgM1>7ep`=gE2nui}>Poi0+-6Z<=BjB6M4;HBokeHX zMa(9S+bX+;1SGy3XlsQul2M%c>2u+OHUaq1Mqlcz&3vWr8FQ3W>Ld^1?(6=SvlnH9 zTXA`ddv|$=#mVB)p*fNm)LXCq#r@&?ZR4gT#C=fv+-U!XPHTl$}#TWTZ9u+Ef> z#M9OmRzgR`4tn=b&%v_*_2yYY$=s?EhprRXh4`Z{GLv(kAbekdS9Y{XUB0k(&<*Dv(HV z6mj@*-A=v5*OsC1yu==5_wkLEF&#boyu97}`1g5v`|;-yfH7uUQs^4I*I)`K`Ho_$ zOpr?Za5(Z_%QJ}X-t#8C9{y zS`mqA`6Uac(mfbIitHdLuS%^9EpY%qIxy!-MeJ#Leit-2mea?26k*xvE6{Y*9_x{b zeTRDkI~Dj=VIHLbhV<(tx&a(zbjQ|0WBS&X8z<%MzHpH>Vmy5l)>8Y#SL?b`E5MYl zg!1hQO$F_^fHbiM0@JTiOHOmMB{AaQyGj*IH+vl)E^qTKX9MgmwWeDh7ls)`+$d zTkXs(c&16Es$O6g#YN{$9aVSF-E16Of7B`vr>Y`2x#<3}F3QBw*4`s{zxs^~>YARg zHf%P?Icg7_$`jbBb#qM3r;VE4Yyq1Y5U-g>*}crf?|YcbAI5CsT2kR)HH`3jo|fOf(#^t-z|3k55b8L$6;p46zki zOIU2N7js3IiN3!Kem6HpVGxGUytWd{_(vht25 z<7m9KPE09%2w9ih2=lSop156Y%Wc_CgO|1q#m^7nX;M{tKx!;{_N+xp2vM$;*oAb3+I1?Z`x?UBN!yto zv=YV?&)Mh&SnL6;v8dTVT-k#KbPPA<$rRiQgpV|xS(Z?TzH46S0%EHJu4CD=S1#5# z;cC@WRm8e0mFzatPAL;$d*@G0MGBq}Sg}{Y5G;GPYhry9`d*J;q+h6;6DwTO%d@D? z+aHr$(G^YQjO7FHRbnr`k^(F2S>%wKMApE&)MJ#s$W3e3Nc9)y#_?npeMZ)`(DFMwD#qaaweLi_#d(Bk+ID>QVl*Fak= zd&R17Kg3h|hIJ&EKKQ&6;#_xoVrmeiL`51yp(=VXWXm4E0#!=n$+fA|lEqnzUU!V# zXdYUgWm#KuxY0RvEl7*~G>tD#3uwe;59*AkJs49n-L9ucodW~i=`ua-ww%VIOsZ?f zw|bQ6D>U6%SEpC@fR0x_{flFPf9B6$SGf0v3%98Aw#BT_Oyy!O~PJKDE_)>ZL_I(zD}B zN1jVF_$lA7z0o>=B4eMev@VA-7)Tv^kacJPu=~pMU`#jGg#8op`ldIpb+jKUF|&h`{y5+q3IO6p-)94lg4|I_j$i9j~vQFi_t8yz`1#ML{!>9n>2gdN3UJYNO|1k(W>`_zJ!F+QWldQ&TM1^akJ}f{yIK9 zIk~%K(Nj=gu_&tny-V$jXWRMVxOBn8-du|hV2P_CU91p%<1l?C^V*_oHPHq28BiQa zSPV;qY~zV#wV<1tJ&PmNp1Zev+?|R`$3a$c1q%22N7VO4L_#_7ni>5r}?0Um?9yoPr7u;n;5}Q~uWo zeX*Zc6yL7>)s_{*xE8SpDb9o#I8;PzFfvg>i2huHc#_F-?dmTqADre!m zvpe6uaWmjp{_Rv~+y6E@S@|~9{`dU38>n3BXT6C+nJ=#T=6jNC{WaVS}sU{W-s zXUmF(D;}`6)zasiPP5*aYZZLfI1@518=}qWwVZGr!dVKz6eP6D060fLfn`U=Y}y0D zvbZnoJMWG1ZSj`S=4-iDAtQ;GoQBy2=0VF}LW%9Aw10lD5 zbGGY6y|+dji`ImsyO`^+V_D@;$V9o;aHW=G%SX>y7^JcTPNLYS!ZSy0A{Gk0kXlo# zLj}c@khpBTk{NA>QcQ)IOOSML?FS7OL7>;xv)BX2qegblA9sdmGqqOKl<_u5a;i)I zxq(s;%g_wRtPVpdL26lY38nO1C9G7j2f0N>b{|+yxE5xzLNz$xd%Cv2P8M$oDRUl6#32c|ZTAem_ zYfD^_Ift7er8qdn%WORi6}jN2L$SdQcunMVEuk7RH9! z1E`Ys=GrMjrS*1HIZm=>uU4asVjxW5)JTC3b6`fRa-KjpW?d;1Rk{asvH`x|o8xP$ zcCpA4^ImB6wLYsa-a?{XZH&qZ&7e3Gc(gK7?T`qoxRxTiY-J1jT-XD-qT}F}=7+-I zR;GNVYDKP9yMX0O$hjqCLSH`nGFYN>17fuAjTV|HaKlm)W)zZ8(XM*z*iK;eVj!irt~T3S_WsP&qxF; zO)j`MLd_{0K`0X`#L(8rIT#r$3em|svOVBMnmo%XrdKn1Z6%wMvq=PAJ5!BT7RD?N zVZ72&R3)rwXpAB`r-2Zv>H*Kv?Ab12$~E)Xa*#uMs`6G%6D?Qs>K5f}kP>kLkT6Ve zgl@HzN_DW6GzCu4>}sy9^EK1ge(%_LYh<{;oug6-16j^=N}>(INstpOEwCO6td$G0 z)d-+w4}Ot3&&-Ys)}L9cQRc%tNv)1wRfC0)2_(mRgZfBlD83oZq-IG~_sD!=4`-8p zHmsSw)?aX)=t&OkJ9<}n#f8r4ffyXEVFZ0 zT1XUnOYe#g*tKOJNBDQavj02fi^wlhMa)oZxEXfui`9YnU>=gZSOwIOXG7|q^utrJ zTjrW`a)hks3a0*5>-c{uhtmC^UBkWheh$x*=^M#!y;G0vxk;VXKkfUy)BUzzRE*jM z{2bN&u*bO5qba>rXu?%iI6T5?Vh89(0k5<^!Es{jkU~_@2#sQEL32_-v}``)+DnfDmB)F6 zT3zC__{Z_ysw7MAi^~Zv-8w+A50)>7bR>pCQ8X|TDd&cYA~j_(hBZc%qLyu(>+`!N zsr+YS*@K%Y;j?`MB>Euj@{mhJ?{STj3c-jE^c^C2sAtq-fd(KqQHEBDm)pPZXLi0X zHjHoRuV~}PQUgye#N5li3{u;01L={lc74eFDy}^6-&%Wkv9`SrtM7hkjYtn_s`%|; z&VsR4VdZC6)a?w03J`!f0o4V{Yz2R5y9&EI;P>uf8>jTa$X?pq-MBU0+|S=z)H-`4 z-<^*thM7~5N^#4V*r=`EQYpbpLt_+wyprM9~Fj{tbR5h7~D zoYD!?KH3wykmc15=Nq$+StPE6GaM9BCpR9RrBZ~l%t_al&{UPfqn)P%Vy(F7;L{#a z)_`7H&rYE2vvyW9@Aa@zLNo+KILAvsMwCLWoxppT^y`Gr zoSn?hCEXzIUHNaxAt^n!NE!E;oizB&d)rI<-|;M&gC^d?OiuYol(kSnDuIa3oLFn2 z010HwRD`o^mow0rcst-|ug>RLZHt?)`^6RWV^{aB`&mMbf2%FzK1+JT<{p-_pYLuc zu(iK=cNBx}md$n0Az$4Parg-6x1NmJRKdi^oi3O#F3o3IrB|gg4=X+xb8;ugr=!KS zID3b_$QO9^KR#(%WiT(kHU~pA_j2I4`n$fn!|?s^9{L|oegV7^{*j|2deoJO>+Np6 zxX;A?jt~E$v7vK*@I}7Q*pQ3Z#aOA`l%?<7$a(tahPS`}C#KK%lJ;+}ICzn7?lGthjxlXI2a+m zMX)D_!$u2#1^`i{6)*^P08|AOa2dvW!pAR!So6U>1yA8=>a_?29mH`wVG1gP+5#vL zb8r^K)pLB+-tFbb;H~(40d56A0+keInaPZTJD_KljARD!p7ke>B}i!uFflGd#)`C% zX^Bx&surGnPu{a_E$Yypp+Ta`0NyGD_bMz`kQogdveg)ZpttBaz2KSdI|}+=6(tk^ z&Y4k9`9uqW;bF+}6stXuI)Qgj^q1kn^F8m~@?PA!&XK7Gu|gzteqt@x5(AM?Yl+6V zl#|?|6cSh38Fj}@?-w{SRiHSj#Sw5|M#T->dJ$Kl!l4b-@HoZ-Ap_m?qUNDTrWjO8 zpnPsnqCnmm4OS%1Sz0iq0D6R$c|_Hbyi%DV7H ztt>ug@K}Gplu`X?9l!tUwu{T1o0EKO=tp1v!4u!HkyAhNK3W-HgdQTFl``c&TRa60 z{*(Ro;waiUZ)ev{bwsEFGdMO22gE3ycL+SSm?_dxPtUjf>d(3ZiPd2{_d&ok&T6#H z3%=jK1Off(_qN%x&q$5g2rqzdCnNNq`E6ampRGslx*hT%tL0b~I>HeF191V>(9HRm z#Uo>dNUFI2bJ_(QqH6PyJ&F+=3(z$WynvEr&P9ITv^SDxUlDO%y0e}l8e2oVZYjf@ zgiXdZ5?kl9!bls3Ffhsqj?flB6pdiJW&ZO};Mh$8fl>5ReYth)rY87D@p_cTl!C+n zY1RDHE&c^5d@dauf&c~aK2*m~6gKDH?=(K#FC7``WV{_Gosm3H1Z_p5k zKxr%Hl+H1b7zx%_;|PPR&Ywwq;sj)VV$A8m{^pD7xi5zJh~TU4y@|%3>pR#8k4k>n z=`2{~1)V`=1}*hrO{b0x6qMcTHt$;chV2yXq_2or9Wum9RG-?FXm zH`Jrh^HLE7?aLqjLWBSN$~kqTyiLV+zfPF=m_uT^5eZjfWLRzz6Z()Ocj6Of{b5zqapwBz7fo0FpI^8IGysQn}W zM~4IhY98M#f+~cP1jQ&=aJY<_%A=?QU#UD3yE-8MiRzD8`Kt_%oTT7D zZqf!>p#f4`h#U&Yp*=8~RvI4{pM<2WMoBrV%_XB;H|?B6RvB|hB$SamrvidPAPsd` zLk`qaGE-Ee8#+g-%|J%1Mm{)C9jqBLUS1Kri-zyJ6jmxts41gjNK+8yxyDiTL$q4o zq>Sv1fFwvwAJjHWvVC9VmjD0|AO-+!+W@jO05&rK1Y`izUjkeK4h%e!jo&6mmx!QT0FU}KR zxP~|cyRhakam053qyPYBMy#p~0CyXmn`_&YbiE;C_mQj!l8qk$i-fGo2 zFfrB?*LhiDArL4E5l1EnAOr{>5OT(Ge@ze|?hptW2oD~8>)BeS8!KZcC;Rr7>=kjU zkUZSkk15~^Bbi-PE7vBZln620DX8)xp*Q8(yqCy%L44gNGKK-{=Z(Dp;N6Mwe z##!J+W(Nlx(&t}^HhSW(svTX;jU2prjyP8w8Lm7hCLc4n5yXyxe}2z57PQh55e+0$ zhx8r<+JyW+x4ck;-plBP=-iI);Ag9q#h#P8N@H$$r6a#NrQyr8)(emA%mhYWd6`27 zSC07Ot&gk2jeS%1*0En>W7gz!-A_A1QKp@sh8v2CoU`dpneyyx&y+?79o#?fF8L$> zuC}3ldX$mg%3`v{doNw5Nc(a;XMPNB1|-=jAP?@xe>>usu2rh;-~6tb)aeKe8SfB^NRm449FuD6P^L9$B~nFtCsIfq z*+&rCll7Ty?&IPl@Z=*CNx-XzmqO-7k_2y*`~XlAge;eF@3)ej9%j>`D`YoYz9K2z2z#6L=5LUl z$j``X?_#Y(6vQiMltz3}e~4Jx4pVU`kc(fjj_j6ydR+4HUY*wOA;Krh#&>oHDSHQz zi)woF!Y9_;V*Y@_CJ_ibxA6e&3Fn~6wN7n6E{?Xx^|aDwKgT- zr9d%U+Odn@yE5i5J(Vsi^wD?<^i+2f?8cQddF*5~(#PFvLIyz7m4$^REl9jl=MXX7 zM*ICA{x$vjHt$`5WwJM;>N{IRFu{?F(0Qw57Px9DH!W#(H_?vZJee#c8Wu*>_Z2z^ zyCSmPn&z+lBJ6wW72aow%?tK3eeU04u5?6+$R;Ymt;l$2AO$d+0@O>FAW-Abj_pGm zK1eKimpz3nFybF~TYisxyT4!GjXIP)wlUjA&`+cMzyxo%=&zu(T2SLb>tvd0{b9iff@?2c(yyt$aUl`1G?+Jkde3{{duO@k2`>h3QjUJ7p(vXQ-Fu^;O70uJ|5 zl2Wx6g=oK59h(u!mV$WhH|7jyW#>jU`$>qY42nR9n%b0ouQOkxc{eosYS?hGV#hDa zs0gYsg1OsH{z&2|a8FB%PzO2dBIuOl1T{4nG|g+Ue-SK_q|Wsb#M=4%Lt(Kt_)+ec znknH194;^;7t~8oJ9fS#&}nZ-0jJyz+9v2gz-Hlzm4gx8<-?hlBSXVhOzyu)aNHT9 z5)P?qc2Z$bjWr@adMG~Xn0e`ahdK5lv9~amhWMQDP-*It*y_u*kv{t*)r9-97gG?7 zQcLnSt3h=Db36)ZF;&?ZQTY-7xnu8O#ncuNZCA z5#^==Yn$d_7kxU5YSbc|a&HzoszG;P`-Z{DIH1lPmDo5L5E(UB%{Ph|bG_86;-L+F z6U>ttL08YcOLkegT3OL7b}Qs)%Bgly!TmM+9R!Yh@iYUV6oO(PQC%DC{jl_>i8S8FM#y&Xt7 zTSTydegsmb?yVl=`Nby9(d zX^+5%%IRddyYl?(j1s*g@l|j>_YO&r{iB37M4FVTh?Ci+2m3Yq(kM$af_t8Rm+W#A zuYsb5!N^}=(9VL>nhmknjVABg+8Sa)>T;T+&J#V}@t$OjAf4Ounb^?GHIrD%D|41C zo8Q^0KG$-b&dtuhM*JmLRIhn?G02i0k&Rbtpi>n+(Y^3Yro`vJT}SBY$+M(w{FX?{ zyCb!2WVISxYuc@WhJBTWFw2g+P$4Y)6W6SPF-sk-Q*+f5PT8*>E_!JqI6GP2s$Vr? z{ONHcnfK^gOhcap*E&(0otp|V4rc^AKIbmvEKUPYj1v7Rq-SJH5VTpPXgMRt-j!!8 ztVI$(tRgTpIRn2KCo_W4aBw=ZuJr_QVK^mj6@_=5Q=rlt;$_W&v>98NW!cx1t%Epf z4Hzf?5rfZnzgm|tde+*8SFy`hW%qu(A8P`E2eLB&XT|q+R+X}Mz_vFzeEUuoUM#Z# zzaw{onLr0Nx|&Vw5%a*ZK+N@N$;xiF+U7|a4eO4C6-Qvd_)Q2p%_(j7!cKac3_9or zPF8j^}SB0yrOILdg~0(KWyfE4X%o<;6%ur5mx&6mgFqXBQuRP@KZ?6 zNRD9G=#4s?h;k7yG|>7i3`x^rHO(%&-!3^ToI1H>ZJ+MZ`Ul$7}Du~JEoe6N~*JjPZuYThva*|kuSQ?-_XlDvEe4)c-Qf7`bC9k<@Wa7!7u*$3rc49@?O3VpS$k% zlX^~Nf6jOYweO$Bz6t)L!_tuiLF>j3dq$4zK_etpX)!K+5(fn|ClTmr+Qy831flM} z(zhwDB5!GKi=6a%FMVaAE4@2{E4^EoF7KYEOS>ue(qx4Ybs3BZi z-6<*9ZLy;;Z6b7FL?!*48XLSt-{_4JkeD3cZtn3}W99^;<^NR@yjl z7e#4)xZhNfokEsIf&^!cP$QYkd(D5my9?uMJ>6+dOGvR!&(7DcNB{so^T3Fvjw?5J z)Uo9nC4E`(^Lr#lN~y;pk7vqY5axG6i8awKv=m#Gby97J#PY%E_{%On8;XkFB!CL7 zrAJ8(X2dZm!75Gn3<#N*Nt=B^#Jd~po^l>P=bzR$iLAb6X@m%kQ&j*}1EA)xMwyiq zT41*>-l}pS&Ml1Wd+bj>rs-7elW*@J3Z5+^NMgn(ozz08*9ij!OqdTicY7(A5QuC$ zBZrdRyerTB+L4LMF0;J^)rxC=Q(}DFcrAA!&Q#U}9V<)1!oS8N63Yjz=1H%=iDF*z;}hAkx+uvgGl zgawUXD3W=C$euHj*IjfLms)gJ8NK>O{seDCOBh#qt+$K-t%5a?vV{J*cEAF1$c!Kf z=1pg!kv)GrRz^ug1t=uo*k*}(%N7>8nlW`SWfsPlIo#v@KiM*-afkGCTLWEH#&Bjh zch8vf3_{8!kZ!htAW9Or0b*;y+@YylON<~2%!Cf(j^Z)$2%UVg;^P~#=B8co%8?z9 zTPQBJKjaDadz@YTPm;g=b4Fp=sy?lnbA9Wf?(R zI{@`_qdGN$K(pB(f^*@vT+AgDF^NVIh|KF?Uam%I-w?-6M!z7zqgQ_B+H`7+1PEr3 z=1Jy}+Rv>-L$7E1;ld*!RlNiY9aNV`VC>~v{rOk-PA*zlUXWPJnyn;7M8#P9G1ht;Yj737R<^XD+9DfJZqvs{whZAW^%k-; z5+XRaf{mO~6AW_-)=*MQ0n9=a=E6(A!x0#r)Z49d+ha{@t#vIX@l<%qSg}+yts&Ts zr~n|OBV$b?j0kh7vd0rO9>z)JOdZSR@+25s*PK2O~y7+#Ioif+98^=x&4(S3v~Y89%Pp&NAk? zrj~ICyJ_H>xnU)ZHCFSyvnyeioW3Yuj6+4iT4mo5YjZ|2*IMvi!bE4CNm%tdCDooJ znI0=0QbP-8j17@SaWfFNX%NwOM$JHT&Sz7(t}}^U+8x0ODDr$n&8Z-AXK;w1Q5kQy z2YX)#Vrt4B|M;!`(|)T)C*OJg0kh}=v~K#QLU~3i1YzFKsGMOG0&s5k!l^MFAq7_J zH&Iu01RE=KcE{b6{H1Hu`Ibb?U&^c$WCCEI9-^(rQG{|TB~=*fIAGeusKJQ%@@}g$ z%ZffEo@vLlLaD$rASwnK6L||^1jL!&2m{Qx4JyD9L~px4^-FDI5}>%X5K+mH2*9Au z3ZUjX45L8GSD0~4y9i=3g14H*#iq&o*x1Vc(`;&bZ$^x!S^#fvdQcy+0=zzKg#wMm z2y40CYi1PeEE-J`2*8*UA)3K|^MSES9owed^{V{)k|L`wO!O~-rg-H87=#VlVwco~ z^vg65Qti=8w+JG7&Rw<}`_ZzZPl>MEGHqT45R5q?&|$QWbDecc3P@-v2D}c;${9g` z?e=r=RaYijl|(Rspv=TgtVAg>MV(p%id5dW4KrLai~t!3DfV3v_iY4c&Ch1NKS$Wh_iUOMlOQ)~E5S9o9d3e}lg|!ctj_{d-wgC9>`N)v>Y2e`yF=xs;zc7ooC1#j7xl zM-8N?Hj?qDDUVdq<}wa(q74)q@e<+y03!fJGyrA{K)IV@a;()ii~awpwvM$PDCK7F zyPJJ2w^_D6M+nGeyn;gEK>;4e8jF-m$TY&d0SpDg3yU_0dWrUmc;C=1d&R!2@N7kKfu88=QlkkjA!Ih=XN4pp#ZW;?5pJDu#tOXkg^m79y9m&BRnv%E|# zs&n#;`;4rP{6BS8CFfb1)WNs3^PTCNpUj}${}B&EpMpPK{&_!0-wPifneZokYv$%^ zrG9+fy7Sh9Kn1Lfykbo^!qW+?z%W;Qnl)dmecZb{hEvU7ZRvse%-($O#}2zBM5(2j z^Kkel)hMsrpHP2agI7&I&r$0B*sU^hrEW#F>$~mWdQQ-_vdF!C?_W8#4$HTfw(P|B zY0l$fc6qaxmrt8tj&tVvyudwc=Q<~_*DqSq}(&on(vbkhb zy{cd1ruNjv^t<$C zYrI@H$5=zr2p8{6#kiVQaFwD^#Fc~|PJzIE%2*znnj10Tea%P%|vkd(C=(N2j zG8cnB6J53$!q3i<`6D{|l^#LxKcJV^|4H6w&E9&L=O1xS71jJWf6dxOS7=0w=_cQi zMBx_0IAL!k5iC(*j^TMLYMDq(a_Ma&fxk329~z-OJmOzRisIml$!fPbo%E{5!1Na5 zUKKKH52{#z9E7GTi9n$YO<33%d#V%fHjzNzz3}4Sm3eT=S-Rr5IqswR<<Z+-D^mvReX_?I-h56l~f<9>rvFQXq8~=%gRaP1E%)cdG?b9BI=Z)~? zm-9rpJv!$o=;VZ}W<2ZAt#*ybfxf;QWLH*N84Y1YnslzHgd^zV&jk-0)+2%8d))nl zF>8YH^lN?7AL$J>{s=fP!|(F;Ut;?gXN^BL8up@*+0yHVBr`Wqh5{ko0~qYO=nVpL zOg5fC?VFMR4bZgnyC6pB#cnjf*ljy?6uLiK>gpzB^$0pjlfc6h0UVxd|6VlZUHQ>8JzYrXME&XZC`XUW%=$!G%n3( zjwpKm)}vHquc8-$%u^VJtHOw|U!p<}ZrNEvJj(zqM2)Rbwq_*R!~9TRjdLzs-qZE| zxXkRYcF3=BTF~#+SdlnRv)QZk){iu`%eEJT%q&M*gi%liC}`_0hP;fT#I|HsJKN|2 zwP{8-dvbBFGKKwqlq#K*Pv})!)fn10IC1_jVwq#Z04hDK(*`1lm}q&=NI*X92?hw; z$O55hMr(V2OzLb?Pv})0QOcYXOJZgs7(tYiDh`CSn9Yo*8#@3Czy?mRBW471zkk*s z+ul7-Rv&*vE}cb(E(Zjl_iuf3xT^l5F)zNELZuc|5pDq!5+~y}AaMF@3wTopQCb@hN&cJdC&?651(@dAtS-~QM2>;UP zm8`eh{Og{$S-G{#-M`J5uJXkob7UIsJOp6`w{W;FX%+?nR7G~)In(71?$jff02%Lf zU;27mJ_q{sec=~>+su!Ue$d5HDRSG#H2%UrBv!EZ*%N7KrZe|V(;%JMDOlH-*LrOH zPK-F!iIbdav9?>miFCyNW&KBMMgX~F<WX%!0>Nc*y`*g(HWl(@F1v2C~ zl}HV2RvyV`-Pzeei&*Y)_%iX<2Xo+j%>Y1IcWa2bdhB#h)fSxtZ-a=*h?%^*uyS|5?s47=}?rO z?Z(G=-HtfFj3XAu+SERqQ=%la$0nDM%qx}m+rp!OH;z!w5Y7qpM0O67rOX0H9A8Et zn z<*J+ia=|K*4P!-zN17$Sorj~a+JMhRkFjy!jP*!m4#?67mB4W~#>)zkbrC63;{zOO zt^j(G@hJ)XtfSN?Z2YQ}<#3&DS5Yz}f&SA|msBF$B3g=!9mp?^$<)6aUv4rU?Ru^V z%T8G2V!uW7$EMx*kpqD6C`2h2j*31 zK@Vky>;AB)0)g<{rF~>a0vo8dE~q%UP5cxYI}m9qZbOA@HD1;|6tpXDuLPRwMsw{7 ztXa}<;?XoCfdJGqmsA|V4VD=jJBV~Fa9+@;&V?P2mPW&s$RmW!h#9pX*BK@TkV6I} zkY#ko&;}JiaNO@L8#v}kq&b6I+FwSTdjratbpVxsSOt{+rHb->ooK!~674dGW19ki zRXmo3l&^1+_~`suSG1@~>~pBAXvpl16ZSo9TzGc?B2bTCjvT8rQ{mXX-KAzY7G|ce zar$^d{st-7okeH21=gD!LPS*A!k7r{!)G-|0$fIMtRGOiYQ<8Bl$JI)l)p3+`ke#y zKKrLy^*^G3c-^FORFbt9X(NH*(<7Hs9F#viWGr?)q>v?J-lHM48v$}(dHCylxnFY- z?;{{4)Lyf+Z5;`78O5t)54`Xh3QGoEo=4PJ+gg|CivmpgY4Z87`2T8ov24Hb2yems2YyA>swZF ztdB_R8i>htQLJ((Eg`(JCD0qt`Dafz8MR=&cqO|>0R5*&{!dQV*LmGsHOpQyGc%3# zt0E4mGdOmoqZj@MrRwz&`t(-4qnnGe7l}-_W4?Am$wk5YcGNWnj`Mj_{CMuM$GI9hH(Mr9fI zY2X`?z@Lu(J?bJ|I|fxFw>|oIrU1fCDsXCRBo~vWTPDDZ~)Tl;%~z z?rX&D*eQUl)niFW$*Na}p(CA^YbtHB&_ZP%x20PQrPEVs86@H$k96SZTXBtBp8Ze4DNxP`YZxQizn6Hd&M<6hS%9BS2>q z4$c`&5?O+r9vK%nD142MTuhtb-?gyG*w0MPU{+eVWmqhIV_>E|*KKXvwr$+CZQHgr zwQbw&6jOVu>D0EZyEe`|?|1&^%9ZSujU+p3D;}hT{*wO3u)%kL_#=a#Q)aN=Zun$> z-QD%aX@jKwVbW2C(JbebZ3WvlV>M%oSQ$qInV{>KG2@Cf6O{tDO+^VSEJ=;2nWZ}s zD4(>Gry+IN57#0xP(Z0F0cq2P!aD$>A^BOmyPlm&e%aO8Y~y}&G&b+pI07ukEhj|tzbg7%IkziTU+>~^hJMD3LsY`q?V5nBno6k*fp6SI(PG8$ zoHfBUS8I+igmIS~I}_6bYXD}KS70|PWg z1WHSRrT)$tN>`O`KD1s)o6iHLA>T=8PW%KayV_A0Wh7j3Y20o^Atm zNCt)yXp`!GW25tyvb-s)pV93g4Wx>ao%IrMvKa{n1Uukvy~Y?T(%lR(<{0Rb+Zo(^ zqgs~yev7!MTyRbi8PL@OcxlS0V?y&%K38L{SH!T*5Pu%nG2<2J_)+vMD_&g)-a8J_ znU=;Kdlr1{1m+0BAvZ-Y{RXY>-o3lTY*75P{a&q3u-U8I9iBD7~z?E5X^p6qVN)NS2lQ66t zb{56(6j=ALwGpT`j?$7^5qSQ}vJ|BmTNT6PyBop_4>R5#;A%)#G9)7`kx?*=P*?`9Eu3k zaC~>PjGvp&oY|>+7YtIG$d>JBZ-ZO0x>@zz`mUSR>;%?Xuc^%yVE>SxfWN1(Gzk-!|Qrd}vp8B^B4Kz;&mA8iFh2ljNBcO~fL@1x6)PKIZp;i6)Z zM6#o37nk8C10Zsp8o#zo;kSXJ9_Qs%H(5xKq)I)ZSHc-(s3Bta#%;18<>JmX13rk- zjQS?5{P}5NpTf}+J9`FY{G9JGz^_Z{nL@@+@`QIF*l`*M`zAnqC(tdNx$^X-L#e!P zIRAT)K<-xpuv5#ffocssHp>wI(u)vgj zec;ux;C&qnliSRxS(%5gksTVr7k_)8Hg10EY? zi%6tR-=a5u1u5k7vivi72rq6;?3uNv=JK%#?JeU-BcpK_IUfn5XoV3Rhq9YDD0t7B_SAnxPeHDl^^#*{|2a zOD88`#d}^nikvO>mAqUhIHy|fC2ZuMuN3zeo6K=etB^mR-;`<+m0L)kuD{og!ufW5 z)>~z#K4$3E1@GvysfmaphNl}R^)^S-uM?u5@rz*(oFPhF(9`8xm$93w zt#5;($7KW=C_QLoB9U>vMA4k_3*h8Li5|V$56~eo++#p!t?W}Yf_jp5mE!#qB}R*m z1!tI_fE0+NvVT2k1VS^b!(Y7w^^&l;^&>;FIon}oRlpROWNG4+SSkGgfF~0KW$*wv zazcp>eby&EgsjIWF`G?Gn-s_Mk_~wocA?D#L}ffssr^V;j4nGTPTF=5)b5c!N87w+ zbhV(Jvd?}&UGNaGovlO+Pmn0W4pg^kFC&ofUx;X)Uws?=s$9Mgjg!Zq;{i2`KhUqp z6KFx($CjR&e)%>Yn_GcUTqRfzvcpKqehsir26zjMIS-RAT6EUK=>T@&_TtyN!T4>E zh=V?LwF3fvCPzz`LJ|zH0QgxJ(P1g%*Ym<924Nx6L9G7cae)9~7dQXMv7MyF*OyCW#FytbE6o?|@&iPo(tf@7PnX%QLt|0@dWsh_ zaH{*bMRBgvIT*vO*Q`6Z&6rqs=*ctq^uu$aqOIn`Ga_EoMFp)`lLP_51u01e8IELc z^XlGuYNPx6{M`HPbp?f$&`7zSS{Rbhf>|z_}6o_hRRN8HwtGJtf1UR^s@-9=%_(v9V_Azj)z1lH<$65IEJW3mGtsA1sd*|M^fyAi<8R1suW>)0FpG3_B15YXn)bY{RP zGt#Z~SMI&mp?m6zvBf?&9q6K@)|vzb#{q5-Oo(L~4S^P6uSiOvCHfWDhG2nM--XS+ z=1{Yge@l2^wBJ)6bg|szWUR*=t+d;0}RE&)Ox}7<#1m*C>XfAw)Z{jZ1SsX z-=MeN2!_p3SSK-74+Ei;A5{R6KyjlHT^*;_jTd3&o6seXQRh=d-X&lN1`N^)IDok1NDSU zhnQ`ZGQbO#Y%xv0kG(WEku05SpOMPnuE}?3+X79$I8zj9wP)Pm{}F?IJD_iu=g#g- zfA+EQ%983Ev4@B_#cm>R1xG%??=vczik8A`5@-R26nL+XTi(%wE-jXf;Jo#Le{%Ei z_kDUcpX{7{3cq#;-iAN1V~3~p3pSyVzTXS4^_PFuUTRX>Z!kJ&m2c?iXvpfc)U4G^ zX#9FDI|%qo)xSkCGQ-q>dsjT4wed&Tdzl>R1JJwcKhWc<^(}XkNdCL`hJTdDrZi{g zl^W!H=+Y?n9wM?^+NZW3&9&hz0QtrVT-=m4=R4qE1xk;4B=epw$`ST0I*hx9Tdsz4 z2G<$WfB`Ih{oFneYK9G*4Z}wRf3lIvudb`O?~f2a7Z-L2px;&eLFaV=rpt99Hr#P& zpWwCgDoF$Iub6z@=;#x#(mPjJr8XUswg2{wFweo(_Tbm+sfEW6X~v8QlBMwCa{1h| z49A+NQ>uwKi>y65%)|!PH>3x2%Tl4!nS5 z%!JqBjpV!m@z=|kM1(RaQj{o_-E4V!06FUDIn7ay6s!bSusD~B#mbkpViGRAC!3t) zcPAK5CH#O0P$P!svUXpl&{6Cavv3RvVgh2`*;FLabm)9~QY2BoP@V(JE}G4{G?*+G zP|`r-skr1(?^;{KKreUXkhx}~sAG3&VHY&f3*aX-Hd^?pP1w8j+684p&VF4!1}t*W zS=l%GINr4zZ;4KI^h+qbNZVO{0vIw}ZCp22GH)Gk8#!*au)4UsdSqrndH6Y8C5$au zEk18jI^!5UY7yW&VzM^I$q@i&zkm078Jand9xWTm|yGg5KL3Y7a zzwNkI7Jh{pnWl1T5dwi!Kj3GK3LPNPSDxZw-HDGm`0oCYroh0S<1C8fqLmTEw1E5= z4R^jJK3z7&4)OcYrU<68+w_QM-Sc62{Ta7ao(NE_OhP(7!s%00PH!#`->CpAa2W z0+Q6phF)7=!7M4k!K;mKX+O*JSLe@ytht7U6A zbxYeF$mQa-(xEljl#}Ip5rjs3yEV9GZLUI|9}9 z=1l(eIF1@4+IbnQKC$LMqsKMR3|tN$Dc6YeumT!seA(8Nb@4F>V*HRBb8_4<^ugtE ztG%uI{(T@kTKHzPO70~6rhJb^VeIHSUy#9`#?3CMTt@rhnD(0>2z5<#+%dLx`Z9>v z-fes3eOQ>+valevX2f5$M9riy*@W$Zr8o;?l`2CzncikWhv{TZnjo1b>}TcCxSpMs z#;8pJ^irdSZk}*lf{^RfxV?k+7@@gmziMLQftBH^h_;APoqnh>(+2OC_p*XpVsGEq zS>hPpku!Uc%4^GDiMHV+{A%Uqg1(5}bSFKhQglM=R`ri450bKZKQTGrNff&&R4pR#g z(q@aCK4aWbPUqVd{B-*5$cPekdv6*K6COa6hG}^v5~}rXBnGaXF}=G5uFD~b*0$l| z!&>>bOLHImK8Eg|@lUX%X??bJq2{R&?zfY*e&UPU@y7#nA+nl;T6V6aWU(mUqA7Q7 zlZ>nzDZPm}0OZv^En%Dq@b5y=@MLSyj}Ok(vr9DrmZm6>>wr6_Hs>=)>dDU#DOUWC z-+Y4!(v4A_Yj@j5tX<#enV)em&uFjkrW zY_t-_H+$$JjUe*dJ_qjY+zU)1O?Ale{NkKyri&l3#9w&~TEr^FHUBy3|5__zRN!O< z4ZlpLC_ieqQl2f55S;zHy~mx|0;5FSWixik+Ii)=lQKsqiTco3_S9TTf7OsI#0XzE zQ>bL#WzPl*;c=F=-`bW*e9PaQi0 z=O@)Hrvp@CrQZ=vhN;-OqkC5JIu|EuyvzIwsqO;fiCwbe$5HPgCdDj(Esoh7*%Slk zcCn;|G{w>qCL2P?*is`?g@4=?3!yovd`t1r%(;>jKf>H$fNyvPr-`@JzLSP2y~>or zW2;m6s_Nm}p68Xtyz1~PbJwP;avk~5o)<_gY@Y5T~Tqj(6L zlzso?;mL)RU$rN-2R>UN*ZTb{6aR$JU>2043umbAr!web=(!x7XoNSBgV@-|go|6| zj^uRor0jey&7{E^`DJtW`HF>yp3b8YG3l&~WO9KTuM;uHq|ObPZ{xS%FlODVzmxwl z#o0=%jePQZk_l)mhn1-FE>FITwpIle+rx{@XO+|RF+HT`SG+rFHpKX^PkH8xGN%4q z4f-z=jI*W%!xV2liJIB(W$E0bu<=9o?`Yf%7)16eSU{<>hy#I>Xpk8>oG?w_cy@dl zx=LCfmsM@$Sxwkce>F<0FxFJ9?aRAozMNGYmsRH%#X|)X{zkyknXhiag=c{7BBYV^ z1;keWFJzA8x(Wxd$3=Q41G`@c!rjbV5j)@CD~}1iyHUAiR;IS=tI#4b;U<$hEIt zQ_pVK&95T=%&=3?8o$d%qQz<_LBkTMEp~@CvoilU_2`z8R}9%7DNSfhp&Ug7Q1_p^ zxw%4I6;kGKq*|oXTJ@ahPJfo?zF2%;>%hUk%K)hX%1wLGBK#{1Fl(5FUvsTO$#Cbl zU>eIU`xXAPZ%G+r4mHr79V;Ucj0@JN@P$?44x-=K$wtepVh(S8qNiIT3%8lhTw`$NUXUJE?iub$K8}9VKf4;pHi8I9wP_Z!objvNN!;%XPb)xmWQz z3e7mx();`VQWew+R-afloE)VMVKzwQ%gd-79v)8gKf793^-?;gR5dZRTubV9#2{5Lp zUd2l~hxOs2-9Mq6dY~JI9JdD~Tu|%e)Jz=KEi7IAofBF~;oF!d5QNv1Sh6_c$G<|{ zfS|U;Iq?Ok>cX*0|06Xum;s|Snk)Q z>iWm8RG9;r1*oboN7;OAjl9$z$@yquP&0!I{^va5OzD>-KWxr~`uT@WOcHZ^I_d)m z%&Qj$De-2aH?Ft;>@48qyHb}p(fc@=)_3ePttUKVkD+9Y_iCd@E2Gjdobof)$ zZ{8%pX4=9%NK-qeCQnKpMg@TJ?fLw<09z*>qA!Tpl8W7}`altmo8URTBV&mzRA+`h zmMUQPFDEstDw}{#z>Tp7i7qTTmg7JV>6N1<_XY*0GoAJ69Z5hRfs8AQR=2~DDexH8 z`sXXIcwlI`RZhihA_fCRz^TW#n9=6=I;$w@Ar5Yd83|p@DE}G!hrrgUqJjY;THvwT)^M`u`tSR(D@)63IDze3)Y#rI?5o zST-tct+RL=GMC!cyE9- zX%YE8WqCtqe(EEpHcLnv32Kj4gAjD1U$Sxg<(B|mg-9VynhY(e9yJMecpHG|pnz?P zGd}xbrYn|-A8oWFFKn9E6#=V&t+Ihm#_<*k(TiFl_n)7P77gmkQ2ty{8roAJBOwAq zjITx?R5icp#D!^aO#SUWixIpanG{`Td&d|f6cB&&xj-)(tY{J`&f&2JN$xp!xs3S3 zm+BXp#t5q@rG)%9{unu1cv28*IpFu}4c+e5dvLFgg>-_QM+@a-g{7P zkRSP=<5e$S(SGe2qm%1K{NI5w&fZ%#JyUz-NHzi((BUk65`7vJS@_5!PN+#UKuseJ zh~K4X9bNoMZQi@^>K5BWe2FX}DRC_q_OO#)e=_F%s<#7IZ%@x8uEVM1tg3kkGA=I% z#ik!#oDS`e@r|6NxC#(j??O$hu*!!!8kEY#RVIz^p%fk$!|2zN(3 z?cbhQN$I)%7r0msh);#OH*nQaHLYkSAuPt!8UqpaqAZAFxrp+4?Ygze(0s1?LZAWf zw{erTx{|}J_V0~+C-);iBk7@ca8x=|Xhhr8-G}6UPSX&!=ayM#Np3Cl7_gZpi}+=K zUQ}wk#q$+b36U(-nz(&DF(cc^tJNrv&uYeiX!BLcpaDKx7Vr|_i!8=B@|TFfL0-KJ zm(^*lVk_&*rHUZqN2BzMQlJn<@&W=E7aaRE&bFNrLfiGWbypIIF0yx zQWpV-iv96o1s!-BaJD}N&x8O6`a62a1nQSQE2E?{%@DwczXk7t2SkUru;`J^jV8gX z*k)YM%1A?;u*iqXD=G9PI-8w2b?A1eD9bIZLLb(Ys_Hq@hKDbnTG^a!B7Yo-@-fVFM#U>mItw}X3mjAFPV+ltx$9(4x*sas#WGJtmg{~IJvn5gy zB>^}O;**ndhMvL%Zn-+zNH8&$02u7b(abu-)hl-4^=)1i`od);A<iHHpa(If%qe@V0p|DM{Q@mk~&Br64vX@4VU8%{P#(!X_| zwI)2DQWnBA7!EiclZBI#P$<)rsKADKjE*Kp$%JJLmg>Z_%_i|Y!`ecW+a?6G5jBmD zypC1LQdg&i6lC@bTHoBGB*BIUudkugw8JHW|CpVL?u;My0ql~bi;;Y$Br_S&w z@;!h0!A3YS4f?pf1TX}n1=fTyV`6~SKm^b{WsNbuQ6#7RO8U=MFiU|Q9{GD>ZsAgj z72s4Zf3zU~U>e%+d;sS>7JpG0kbxz2jgk>1r$8^Lm|d^y(5GA6nzX|{05jkBzi?&h zS1v5=|1|Kl%}~ovKJGW}k2HseorZ~4$7@g>osPdzXZU4GBh8<@5=_9X;?14;i{2vB zf_^cwr_T|>q3EGLf@C%qVr-Z_G;sGQb6c>7Tm%x8j6&cmU56L;OR7Kr`Ip|?3 zwPCn1mX!aUB-m<3dRo=G@SYyl6;bl?c?Am@ev zO&7!5bd{~jW@n?Pe4dlR3zctSdZY#@RdruQUY|KnN-p}Q-U%njp8be$h%5tBnMLK& z4lYu5vjViJ*jR*k%X$Xmf ziFeG!n6GC+V4AY^R|`(FR+8$Q5LWnlcdL@(9?O#5sbB!TZ)-dCJNnLv{TOJ3R5Xts z5}^@`W`P;!Tz5ocWeum;0_l-tod&c`Qx_}AttHH*BlVI)-ElvpRm0Yg!X>rR55Oj> zuKFb0sJE6#?y}xd=a=fik)D!jwvqc;SZvNU3Se=%+DQ(X#<-jwn>1GT8XInk4R%eF zo@p4WeF6n(S~H|PRfk#-!BA|=1`t`{;6eYfFdQjvOiQju_khlu3hBlkp8$!@wDnv7 zGl~I7(`=xx&L-e^Xqati5-b@eqQga++B}&|)V2s(Q(ZwzP)xQiqNXZ#}Q*gJf-ZYG8~K045nh1 z9Cr~aa@039Gdq8^fro6>%D z%go0g6Ila%R$ah4gsb%qmmyjgoJP$ceSr-Ns2kq+t?jb@68hU~hRke43U=8L007ZZ1g2^d#dAwF> z8A%mKcNgkV1Yna!p6M^nEwt|AWNnjoZcnRU@dFjkR{vu=PGg~sps^;~lgVN@6Qw5( zj%%&86s$xiNdRiB%&b{AN$ic*3(;UKLF1>iPo#gYOEx2A=U9u5LXwKw>tGQ6p%65# za*(w>1fQZ{3;>hgm%G{2qg&YJJXpr}6PX?P(2{zyO?RfP4BwdMBOJ{G14qP>Ju`_b zWjMHtE=17`))?Z66gHdzQ27xz7Qk+Vj3Qfs*K%AR#UaH(p`Dn(QHPMSLxqdlnj|%; zBM$wm%QS`NBn&DD>Xm@&5jvQt_4$LQhLI_1fJUx+Z4@L90}!PSBZE1>HjN6_S$hl3 zhn8Q05{Y*YTvF}LQ_8RI1-j5rNJ)DCk}!1soQu9yey?cuRD_(y%yJ4UZaf}D>Ck!V zbkM!Nkv9uxln=IA#DG)8BnkdO7^Q-_$CSW%mu%UYSpX8$Y^y|HlPM9$e{`M>Lxj7( z04x@*^6K*52J1IemJU*u(edjF`Z|ZXdkOT#qDCxMH&LWnEtkKl({=K|*n$;hZ^4FAVuj{jOVf{Y$8FQ8~jpEZv%bg=m2DTN4o_sPQ zSsV_@m;wc5Pkwd@hcyx8k6j7m`!`!EDdfTBw^?%c0sss_7L9@tm5pI_JzbUp77v$J zYEW7y{!~5~L0M^u+5SMdZQ*wkf2qlq0lHAoAKE;yDHqaGb(*G22>GEX7SZB1w1y_~ zt65wHcL?dB*ZVpc_F@|N-Ujfu?mz4LjsgoR-Qhi{J4)m^e^RyHD-1=xq6(n$-?@C> zYSdppLF*-gxkrg1#IEqbF+dg#-%CnX4B$1Ns-6b83(y3>S;4-$gl8HI)&qe9dj<3P z1T}Kb{C^BGjM5KO z{Ypr9XE5@=gg^dVlm9aQXddBul&!S}7#$WTFCj}x+&;lSOW}wvQ8ogpud@c45=RaN z3`DH%ZKvsjSifWP%<3dv>C^C_Xk$PST4;|VC;gb12)I=mRT9{fR!QJE6eU01yJ>Yo zW+f_+?DZ76))z`wTb71G{V*@RyeKAv-j6$0!HU3@x29z}BFsQg)FTj9`E;WqC~2@1 z|Gl0z;9LtW1W}I@a?2)nvqlx}nk)|1G;@5Q77v4)8s^Ll17Q$@Hr6Du;JjuBMKcwY z>({#2PhM^|+t4wySsS{;KeAML&|W&%_}%Y*X`+eMwo~>cA~U!syou>W>0yMsVm6_R zeH~g=cA#~C`?fdj-=%u;wj;y>C=v89-1FIX=JT>KEYCB1bIWyE%L|^vuobn8N_942 zRSqRM4jT*`rrRB1A6?f;GQEdgn|hg?)Ct&W)KPsgHliUg?td}d?P-kPyA4ex~KVEBq_MR`4+#-f9vUuhgxsiaq zz@Q&uT1oRdF-oWiBHRt7{;>PBXcqd_y1+8Rg0`3R!j+UC9fc+Rc;<+}de@MnAEgvr z4p}?!7i-jpc> z%Xu&vNj06Vqq|GVCw^N2z*R@RzTs(P_V4;lI6PhQ_1)M`?Tbrx`DAGCTMNCTs;}no zL{}kjK#OpAu5Wojm8gGBDDS(`fXFyn2?|I3P<-G~*FYoMrHJpZ+6e-? z0|#Me_mThsK`>^dP`mi%Bv*!L`wPmu7u;|B_>kg^0e!nnK*R!W8~ll~nxP`2@ zF)xTtRrT~F1{K}Qct@SO3^*96t&KB@=TkH)w;&vAp;XsSysam%Z#po*TTLb%58~p1|tnU`qbI&S#N2-*WRI*eSGIgnxAMLNeN- zHfpvSlTS2upiP0Hsc6J|Vc)WEadjsNyRD(!AySA^m0O!0X69)0EN<4{{0BdXh3crG z4g(Y^4|X0qhrMWaWJbz$fxoiAK-gtwG}4hY5{UI7UW(BAdFp)m6|Ar2E%yY((&yDxy#KJec{*I@TgJTQlVkA@Y4z!PUL=cz|TwV3UYVCc3-exB}i7z)dF$iVhOr=kLCR{#2<7_R8rU#=` zyAmjMPAQY=FDPalm2*3C>IaX<&?r!1%xrFUyr^2Z4TL+)_rDMQlJH!?jnyCTYrNt) z?^wmiUY#*f8KE!Ir-O2FK!zUzJfhQJpP#!1u*<=6XqwxI76Bf{C6W7A_22Ch{aJQ! z-&VDB_J9GaAC*oTwk>9RE+#CuVY$?o@gGE=L`YdNs_sXr$1~cRCe?opz6cemCNlQvJ;~QKx50U?k7agNlqkS>zn-3F!WYJfU9%K;h0~TwA<RunVR~-QxmaX(z77dbw zshnd-LsV>Q+>DA0a}MS2|FB!Y|7;L;D?&0kh-_w21``l{Zz6s2ZoJBfB=Ipz!vUN5=gQ*#>$uq^uI8!KV7=2EYE5N0zQt zSBu~TAyVgt4UzFz9g(l|xFt&ljLmOUg1>Yz;1I##%ceIs74?jc)pA0N-Kf8O0& z`vP(U`SG@T-;n4gdu@Y0aq`oAhYYn`yJ-0R=B2H&v1HAeAmN_et!Jb`!FAx%8cMiZ z)o`ZXnP%LC+4Gzv{9OJ=iv zD5zgnkD!sIFCdQ?_g!GA9sy3l1YQt)U9q~1nWtOkT4(#)+7ppW!${<;7n0PnS@ke} z(N?5?Y47xQFb}`g=!~a9IB=Od%#ac7PCoy8F)HrEbDHz!=k36g#6Q700n?g|g)66_so{=d0eG)k3a(wy=l z?HfK3=5O;%d9n9aSa#L(Oif)}zE;%ezCi5arWN*yjuMQk6e%d5FNf`ixf-~UBsBPy zN`Pajq361LtbWEoI=5rn89j%cz{bsRk|A|-{BO;|W7w@ts7xdC_zL~_z5t7512`*~ zs9h{eM>ZuHwTJb8;R#5orLqKsm+>aisD9I9;*X5De!PZDDLbN2o15wja=+y)oo(9J ztR4v&RpoU$B`f6dSR`628CfR9^+u`S3vtx{`m)MzQgU&a1tb%~>VTD>|M=^d)4dhH zbmVhs_oqbth(EIX!^;xNEB7EB7-7L)&#HuLc7lZkKn$#G! zL;b8Ob~1y^%cc`BK;6>h?-#w!Ysa1kPCJHnueN!_y3nyrdVyq4qf9+Sba@|T6-_8Y zaH~E3!x+gPsQV1MM+PMt?o$A6V?)~B$EHoZilJuzRx;|L=+kSNYl3C$MU~W zIWj_D;Xi+-zacif`YN@ED3T*1{cp^TFlG(tHwjb4LgtQhA855p(a%RaPf&Ip5-NfX zp3GJ-cH^>`4P{0ysVH0N~9bP#PNM?(`FJIuZ*A_&N$QV z7O|@T4|OJt(a$&2ps(#neUn+^+Fm8=gw7fkv6&w~F@Mc>f-PKx)c{#TPn@0g*Q!s- zCr%{<0dWy|I4+Cq5O_1#R(Wr6T7}IA4>f3F04%U0(>UMUEyDN9yHlU25vGA%)lE~! z-ThPBCSbe);hRId(Ws&35f${8Sk)|D$&g%4<5(hUl-*)LQVVo51`Vz@X4mi(l$+uG z&-nSnz5AHxkT})Tlq~i#a{r>oEom}+?noUa{F!f%`cHVD|D^L0GKY;nd6*OKkXd3@ zkkm9zQ9%gGsH*#Tv?K^9cXikoTA>|c(e)D*{ZAvP;+~K1p^_By+Hp_x_S*A#8Zq_# z9x?qqzRlP}0^$WCDLw9~oVgEdD>b-cv5wSwG*^rxWYSH^Uqp5P`<^+@#U-&vkw(Rh zz#APO@}wxH_PD8^1t-_0=IBf$z(j_j89s%KhP>^rqC>@FC6)p?gdurCUi7?8XuE!G zy8tXDhQClRe}uzMvmnGL{e$|u58L4bxntsT(2^{fZR3+lx*FS>$3x>aOjt^SksIuYbIMonQvAC!LghLnfJkftB zl*Vb{WMb#HUtdE%^MchzQSj<0^EdrYvy$z=!7jjtP7W7%do4J5bjyUQLdQX9pkGf? z(ehk3emt!Vrq$BQ{4TDJ5>d5JQYqR_>lrgG)!GZu#J%JFl6g`Rz-C$)$I#<$a;GXINFJ3-qQ=43; z{0k;+-K8Ha2C_bm&!U0 zemI(kZ~XrCDC6rC7p3&~9x7}7vQ4@YT+qd~YNOBNqExm1KSaV3$9{N;jetFk9xuiRCeCxe zTYXJdP&^vh^*86lx1+ZiWnJp4^;DYmUSdc76abR=aE+JfF@**^H_GS4;_j&9c>@Ru zI=!47xa1lE^@cvdk7k#RQt!*?FwWy!9}w#X2q_k!abTIjvF}^4Up*XmK4BwDnV?l1 zwqu%2P{5!`E2{*7rnO$(Ef~DC-YOEl0ED61d~|4iwAKHckr%fgHg?TX(?2h200g+& z4(Y7b;dH=zAi|H^1KrTRO0=oTvNZ^IIJ@1-zNM~!o0BRdjnjC*77?g;LAC+P zQRVPnLsgd42QJrrNUs<^-<;EWx^K2Bw~C;&d%^5klK$0^l%Wx8Nb^ zgpJutR$`AP1hdnMODx(s*8pUcpjs(R1h(K@!Wtfz(RR?;=A@r%)dUn6#r=38Er9r3 z{-2N>e*UP+Vvf(B&&wry$_u#-3!H;ygyY^^6LI`Oe;7odLYi45k?id%Lg?ofHJkTO zt#JIzr+zyn3k;L(@jrSXwse{fmxVR+HWW>&DkBb%&B&l4xO7dP_BkL9D znM9Inm52DFpu22wCx^(;Qa7Zv9h}q<*D$3$5MO2BM_6>4hih#EOV!_ zM-Ke6m?vYP@nikRFhmi9*M*5t^GqkR{(sS%IYuFJe3uWYcD)!NSW!rdCoWl14gYUa z9|u*&?`1T#N3FL_vcYW!(z^d}pP=ypHx*_{Gq?->nQb93A8HqQJS^E}9Gv$B55Fzd z&^TRw;Tr(Tcu^ZB`!2$_#wMMH$OdN%6@RQsgE-6GmDq+_&tPMNpWHd#V)v;KVu;bZ<&;o`~4b4Nc~`(JxjIDas^%HPDAb~Lu_U?bv9H{`b<55d3`6;xDhh93p+9ELDO zrE>JU(t}xOT6a>xgJ4HRacVpbz$~*IY{LgkSkj#5@3^hH@hDC-GR92!#0A+)&NGzL zOGFHMRdXgNnPw5G5d2}U@X=K|m56chAq+h&RrEEkT`YPq64+g3dn-+Xqu^Vz@wQFq z4lUC0eH-?)8o0C{d@C#Nc$}jWHDD%u`A+1x*rw_kP2?2f)<0YPtN^MfO^WF79K|#r zzesdKr*Mr+0qj*SK{<}~vrMXtY?yOQUp;&(a84x3RCcnvDPb(iyiL3GrH9i3q$E0} zQ|=ThMYxMD#q(R!r^qo|P&%-8`vEPII0HnL$ptX=Nuqz#7aJh;IcddR4x4#$MKlzO zHq%t@OqDLO-wNC~f7}M5w#46{*A>dM5DknT)obHoc(U#)%gIX~B`T$cxEcelx2lAR zm?Exuj%x?|d1fRl{!!olS{J@&pxBAFZCAPfn@`o3@TT$2&T)zCMl=99AeRF=Q77Ii zZ&o)y3rNB-ZgHKAQU8F|=IHP1>-}Bm2~_FO2`4|*=-O`;V$Cc0_31N|7IyB%TMClz zUfX%xnKf$p=X6&cMnF|L_$MbQvy8M^8cHpk{U~v^S9k;p^8@1-aezTPJPrdk1jo>f6LTQhwXD9D!>Ht>nC> zJOgFL8&}C|+n2T$_@8{nHE7$;JneRp%Rl;>67YnMMoOELWYGyB<<+MUzegy|?0hS{ zj4w};lCw_n!h1=7YEPZOh#~5uwrc5+cn!&R48Tz!@rMc{7I7@8WML1FGzFc?ASWcu7NPK9Dg$k8n ztpo985JYpkDqDShNrI3h9Dw`D2022dbSHK92Ox7$+DCeLIfN6~J{m}Ygf4D-?75Bv zNjqWIKsG-Pk|JAr%I84%Jt5>6L4emx?SloLDxrYaCv*d6i@S}&0G)*$E-vZq-fEPP=f3VTy~i~EWxGe zzc?R|EE%Z0THFy5%JS;Q9>e{NUEl53?=9Nq9Qx6qpwAEVx~3NBc7yF*US96OMm+)N zPfOMDPDkH~!u?#S?%?^A#~S#;WS}n0!(aTzDG)DQ*q#6LI$%{k+0Eu*hseXiJcvltul z8XG2?$U;%U1(4@;5++Mj+0=zh*0fSy3Q1dm>%gTou^aAK0mpWJA5QE1Y}+0+Vi@To zyg^IkGoTuPphZC=T_%(z&$g%8RQmR=^9# zBVDFa#+@N<_(K5GIgU+P0<#9LDMDLzK$a@^PAY1x$h}X+V~jYoF9y{yqeDPJNN&#g zfjp*H-#Ps^YMe0^I7fFCXF{YvGa$%3m+RG>MwR%Y{V3IQ-0prQ`#aGl$aZeo3>+U( zZiM$?R^mN1A^sR>8hfFz%3fCbv?ssxZZ2)gxxHLPtO-5}}IylBh~;5F!ZdSxEMX)FDxGVM9}!V+@Wa9ca9dND5Fk>cZ4 zLQY&ubaou60}dNr?ZpuVNkKKW@h_o=De91>i!ai^V3@#|;)9-t(f>q3@33X-%n-ho zhm`d!{T`d@y)3<}jaSJ_sr9-=db?aB$Fa5#0#-r>RsR|l#c4%v1W}%1kdh<&Ct^aQ zKl>laybH>s@l5>NbeW0SR><)wI&oVH&xzgCdWCKnEjoSo0z#~`1-Dk((fGdt9|4U-_LC_ban%?$)m!ubSU+eK>&oSyre`Dusg zTG~;Kkd5N9$|^r*UB3MJ>t`tm_bL+ zX$A?$bH9G}=cUd7Td%GX9Q0}t;p!IAv)fRrF($l^jCVPQ=mqic&9T|XH=D}=^I*-I zx+Zw~i;88ErPvkb<@0S4Vb}6gb+V8DrJ&+xnKoOT3TPr}TXa7v) zNwmDfy_clZ-W%)7Qu{VWERHOgAY|pggYbE|d=62vTkXWwKl=_)ML5An^eTLl0rtGB zQj?<}2?=h@j{85E1kFBHMj*2{q|)2ZC$!^>E2*Wk!$b&|Q0g9Pn0r8#Nm3)G4qN{1 zdt&T>+$+nr2RH^^nM9^JeJGHYK z8A8K{{-kWj7_$34NHCxkD!Y#bML$XiQVVe@(!f#SdX$frT5Ohd@ID3oR?;>5VTps5 zfx3ki7{xn1Z$6*aZMG)t$-nt^qP`RpqtV0sg2^(uUWtZmH z212MMWTiBG`Kg={X=zqv`8mxPXprl$$PRy_*_E+r2bpIxWax;4vNaO22uKQelP||F z=q~wJU@+hYv1Pr~-Vim(u zpoM9KF_RIH#lvQLPAyP|7YDNyBc3wI;Eu4RFS;$axHy?ce#H# zi;&m~4BRpq)FbPr-mN}N7PcQxdK4(r6)gZ3@p2CT*1zH|{deZ-|G3z+UA$-Ez?|FC zu$*#GYl1Quc`!G5i6dOhkV$39to)HT+Dcay1=(9IEEQU(dk%Y=G zRS{7rmK2_P0rDAb7O@!ur8$gz`nOl7iG0V<90ZRTWN0=QCR0|3Z*HJeH!%n7kXab&{& z$PIN$Ct?M@5bN{R$rR+x`TFXMh4>%1e-ID@00aOtGzBIA0AFQi)xJPdQ)|`9Q9SQ6 z=S+5&Rx#qXFc#pgM}?+2@0w{CP)mG0F8|KyzW~vh0UDYBurL552fZ^>n%19ACxG0` zLNxJ#Uy$n64>Ptz)~v&eOd5rAU(r!q>uOIYOJC+ju#=?#HLqS!sND zY~toMey?gr8Z{QYcHC<2F}$iIYu$K!B1SbU=)fh0Bmh7J0BB|at`7{|-rL){`|IX= zZ@c$h-L~Dj(c9f6iSH)o-f(UNDnYgdNJ_Tanlj6Q3bIxUsnJ3af{7%Oq~XUbA+)yh ziy4s*@F3VLAR=-o2%vzCS#|8^{_d~rPk~BvPoLetgZtBLe*+VK+@oSYZdM-Yy12}4 zy6?Zf{b%0XxJ^0Kb#AZCt+>x6?6w1LJ>1*cLe6`F!xwnAmJ#zaX|7*Y?Raf|?e)J< zZryfm(eJ_~^#301{o>Zy*5KNfV(cD&UG#r1CDerN4867{uKzxkDZ9$-yUjYc%au5+ zGcE69&*@~Yk^nKbtmo}96O|6JVeIS5C9hrL1S=bP!nu1FoL$<^S|UDP@r&;Cj^Doo z|F(Qt|KeJ67te-|2vN)oSBTr)UO`SG+>^Qu)hdtR*oG9IDIL`~ZPtmmN+wq0FevA{ z%5LtB1(`CAm~T;+yefD2x94WP5fIHX@qPDJ;+Q2qn)Zeu(XL!E361=+e+T@of8E9< zxDWiFm4711XG%Q=9~I)`$G#j8IXL(KD&cH(b4qapcMkb$zGj#t55yn%57ZTsWqyU+ z_UJ@{#a3*Mn=P%tcT@OA@2opa8{FO5_kHkY&Gja%EahfOqz!i@UKh_x!w~X~2KWN#4SonRkYp4Q0|tdxJ_%@B zC*t#sbjgPegq5z7t``glpmPxZbHEage`!>)#>;f8%hh;(x_v-!%st*K{5n&#Lt>bW z6C0pdn$8A8j+=LRpV

1fT%VdRu4FAH;h-Qt8`hQz2w3`L}iRS#6d!>AAe%wAx$I zHjmb~>o*hJHVCM}c*wk7T94ex3U-prIPU3CLn5>BSlJ?_?Aq1{a#-3dYzMyrmt;@A zFRtWyOMy8~tyLYu#pj61OW!lG$Y!(ndtLcqhi5CV zwws%OK+v>=c3^D+jkE$ z!QDCSu0^_RJ9QKRo_1#cGH^t?!*TDX9Z#2lB3mhZ?joS`3uRDG9e0Jzi)d$OVY|14BB#B*e>3ekHS! zNQzn#dSRrbj>6QA--)F1U^|jX=5<6~-Td_@8=$&K)R0j|3;`4#>`!Hm#c?huKMUSk$0#1?RKu{RaG7r2q{|`TnH=O`4M_4 zd)}I%4sT+ysS>Hn!Z*_1-yrh?k8#lZQUHJ>y$VeMGQx<~fU{(~uH>=USD7)tV0C3k zdreiZ!nhS_YPppr`Cae&yda=pI}v)`lgfL$6T!cHU5y~p=lR3Wxc1VK-!EIQd9=?J zVHHJ;cwOa!`HKoM7}wBqR^izB$p)&I%mR{2jDj8zwcu0%iRQJ2VfH>6 z$Nngt4cgSH`);h_rl#)v^KnMn&CQJ!5GrG=jvU8w=7khIoMu1aC9R$Ghm4KLC?E!A z6fV)<^6$0UvN}7Evco;xqs7eFUE}U&vL0dRqJ-Y@mDcTD%6BMS7v~e+8pDAHRrh$4@Qx}yz?&}u zM)=M|ZW?-rL*~wvsuIQ368Q6bVU8daAl(js_K)DbwYA{w9WT9f7|Jh$H(gu0BSSTf zLq9bERfAa-jK0XgM{+lZzDz$AF5KEZciZKmkKNjm%%Axjg=U;#s2<^^>S8s zC`Je4vbl4?^enfKj2xf~4$pK5ImiiKS1hXvlbqGwcMlp$(xY$~AX0#VKu=|Dyne(L z41i_`j%RVbz%7&f3+PltQYhy38U;L~o8=Q5p7u&N*S@EF6%uZFH?k(o)1KY&qm=fK%@X2r^#QTG5m0HWWsKjVlW9UJw{R5GsriX2jIO>ruW1R)2HNInka55xgi7X54y*?C z21-|C6o?6u!iSrpbai7la?wm7@Y@|yF5rPvnHWKR7*Tbsls3cI@VP3{% z!)s1OzHc6Uy4J;o(?`#}BO)zFO}C8W(Q_NaDNK)aK{nBEkaIp6g~R}p0(sQrr}1-x zaB}?W$NLT1bOO}w$m5x?yH(LlS$fAOOnN$h&cX1GXUp28nCN9VNfdL@kgoOx7EoZo zaC8JATp)WOjuaG1{ip8ezG>tAPqB0s3z=DX(j>8IaZYF;hN!A%IWrS>iY{wuuU%s< zXZM_%R38s@HA3<$H~J#f34wQpv)Wpd49Pers_0z&8AqtO3t|FE0r`-~Pvh%PV|M#H z9}qWr!TRc4tu=L19Zy3n*1h8Wog~p}_d9LqX+OIQE`24?7(cKBkL(Cvx8$XOCe!aj z=^r71&Rw_@$O;hLM^)<;r?owJ@0%O#z^meK=JNbEXg@lsocjZib{``2N%Rp^p*xL$ zg9}+(6TqnPrKfF30Y{JrC=JRw6vY+;Vl7mzF9I1yG#xHOPr?1}7?yR^eid40*zpPZ>Vn|H@~|SvgPz zV%|}-St%Mu$za7LC(ytbl(DL#&=?>njL{&T`;V^l;x>WL!giqxC)r~fRRRWhHfmGl z-*p+N9%P#qEU$|WJ|2{`!DIGaLhNZ2pcRaKp5MT$*TYS>F+T5wkpLM2#GI0JFBEh) zzZvir)SKKGu;r_nC!FrGPr5vnt52k*L)v;NteWZYaIemgBSL~%{hTAjjp~75PNykQpu_`s!o?j*?LE;4uEevqPP4}Xbg}PMpqD6Ryxqw zSB(oC3<_sVQbvf766xGgu(H*uimFY|krwD&wbG)1X$iSoC=BgNH0hrI_<&8JG?!qG zvveNQEEGJcEfvn-EF>G@Qs51rAHo@cj4)z?ppd?&UiINVJBw-EH7`w*H#Fl!cH|dx zIZ6N&pLW+Ssix5$ZV^ z=1PwybM0=qm}hIkL}nDqphmKs zW}%&!>5Oi5<`eZo9Tv-{mVDjy<82`l#@Q*gkoHpfAuPDxovVdVF+||~fAT|Q6c7VS z3j2vFD>g)UQh1cf(@lXOjE2AP|7I|+k<%?&HOt`*ap=5AGM~zlh!sVzZ-0DU$p%$B z#3xLu$hb2y;zEO|G9q|AgH{BidJ6FYGQx-rg6u8QNaFK+F11g3MsYi9dI`Lt$yqUg z$yZ3ML8m%AGO&!b=%Ac}(~!z;eu`N=`a*Yl-Jmdf>3~AKZ=LH zMeMra`@+XRk2#Eu>bZ=QGXA<$exJtsRJL9xgr7Su_iAf|4GO#P1L);q=TQEO%iOKJ zs~Lg=_Dh#-7&-@@w7Q8lq?!(x{Bl~UHfqZMl`h&**bI;NyN@C-!5g(&gE%)G!&`N zUVhTWJYQ0CS9T1m911xo7aES#(rmfsc?;vd4cvth&k!F63Z3lcY?Dl}zRBPPCN&}f z&2SO|g_Z*OtAvInsa|s(R2Fbu%DQ~4&RodqXfCNwVO>dORlq|9p`K^!xKv^_b_)ci zm>5s|?awD%U=Tq^3VzkJ!R}~|-r6+9KY8g8z$v+eS{(35Z1kAl`5dza=1#B+`=V9q zt?Ist|0eq3Jpx*w2P1CNiU^njOU@PoT>F7t=t0dmky3zCRr=9i?~NMfA0hT*=wm?b zr~z?!fjUNn4FXZ17LfvPr7scRSFeZYb<(~3UD|o^d1cOI({{-n&JjzIyliM5x=v|&fKVb|GxR*jd)ur6cG(|YN%8bWJp z*)DC12k1s-*@5ki985px(JOR|o40%9dc4WCx7lZHgu~4nT}tQ3dbA?~hqp>kltI1s z+&2-3_V~M+PoRPTk;x#Ch>%Nap1AApreVuYeHO2!Ha zHOv9MMhJ+iKz#?f3p%6_voi|)5>>DFvsznKu(V^^vk_#puVa_iJWbjZD^$}J=xe|I z`f-rH_G}xyxI*@hCi#e>1b~$oDTOBkOY%+$J<1uWVP1$6_OR!3I0c9?9WDE1wYy{} zD}(zJ9y;{|28e22+5LKsSW}4NLSZx=TM~N7smdc1)&R=V3_HAC=%~)#qZA+tX65YJ z*ym(H=LEEXd#ZR%v0$N+dHsJ^`h38VufMzf&rO7x?|(7!*6P04dGk3*uI1aVYAHLfE&-HztGp7xhppozB1l> zW~*hd^g9>NO{IhSr||Diml?BcQ`o;cyy|mI8 zj0$mxlS{!e2&f&@c!6giVo?UWG*8$Dm5BEn1-p)mTW4!_T}qemxgG=E^Bd1itAp2T z++#u1Fd}xsF-+V$uHR92@-B?)@_N~E@0N!C`h6+8<(fP}8h<@q8t%#|r;eK|5c_YP zw<|+J`7|&RDd&cIA~j_(hBZcnqCshdzezKlFoF{`fC;Rgy9cEWK= zEIX3lQ?VJOp%IR@!s8KF6FWF#Le8v%LK!=q0w?@o&B|2@BV_|Lkh%Q$FKdMOveRQ3 ziw}-a;_p;yVvA4P<;3Of-B)pqsT>?*!@>m5tf;^lt`*t<4FVtta^H*YLX2h*^*0K3 zDQY@0J>ufxW?sIn!OOZMMy>hE-5nL2HUo6R#yhTfk9JBARx71{lyrm-+sV{1H*Zi=Y&^`0$!12%8px%$LXJN(>IpGipu8|QWP{Yrz3^qmM^hTTlS?= z;+BTTDE@!U4qYkO&Px8VJ<`ryTjI2`x?$7VvT0{T&*&uqlP+V4=aF-3Z%KJ{M%g^I zJ35@sSK@Q{*88=wOCIeEVg}M;gm;F>Ekr|%cS=BFXNd}7+~`W!CMWDmyD|t>EPHQ* zxxL(3dW}JQg?n6p*Bb$%*32oKK;w>A3O7OdZ6n2Mvy|hlwetSa-^~hP$Ne9AIdr&i zQ-gx)gvUem!~tV~+2~r&Gq2Lutc*fpfMo&eLAbHXw({T~V`j|CWbVvh-74c(_d6Jr zPz^y54)GF@&!rG+C-7e8I1DX)E))jJuIDQBX;gdHwtsEY0<&rNuOd=uZ*6atyQH<& zE^+5ofv&WlS}Nr?cNHoz{%Y8X=YneuMj!}K?}+8_;VIQ$l%}tx@H=)ZDeNWe>=kzP z_|{U+W%~GlNTug!$)LnYfSduCuz7@Wn4qD){S^L>t`ZGnbI(INFpnxR0}+w!R>Gux zYin%WwVC7#Xnd~{{wQ?qZKwS%3ak8E>&LzKo%G`{bU+B<${;nAA&dk=#8S$l5yqi= z5-HprU5p6bd+-Q+&}|- zUjerYAk0ce1D#|u!A8)yKb681&})-n6W3>U;Q2Vx<+R5bq!$L`7+N7TMJUMC#Lp=| z3koAZSItsdtan5*wKGktfer|XWC4URm>yt+v@&!7SX%^7_(Ph}&$Iv+O*f{tw2NgL zzv03-wQLRbW4w$lRXv-1rLSb8Qe~`f|I$zc@~bG^d$15es=Qs6cri9Xt2G2+Z|V%d zrvQh*FxH> zm@bvt*1LPo#}Z=gnbdKRH|8A`S#y9Ej46N~VdI`x3fDk%q4_Z-Y-e10Ueug!u*hi% zW+LccOol^^RXS)V337VB@QrX68ufhCyJ;bnv)ihs-<0e*XsCVk)AypF}Bja>z83m)aH8Q z%B5jHQGF{JTE@~qPY9fd8I4Ce>N*XmN|T^Twr4+!vuhi2D4o#_jOjc2~^4=twsxl$5(a5&K*Yt7i(*PkKViV*G`|MZLp zF_rNs8pBnxpRe%2yoDxL(2>;It){E){aN4FaE5$2>(bQGoB%Z4Lr6FgiiePhOB4f9 z4gJtA^i<~yT?!BpoxJ3{hkEG)do-{2`3tM}m9f&7S}!XS*~-FA$q+j+Pt_@VpsRep zL|6W=N-gFpFDWC8QtP@+842XN%8@tz%s)wY93QlBru=u#YuySs|0Gk?%~i+P2Zlg~ z^B?Zl`6VTM&mrE4vySISIzqPLJ^M=&o(YMRDK$eX&oYu}t$zs+D(lZrNdS@Mq}Ocp z`jec0V~c+|LQOvy+5XNRoBv7q>Yi7gC{%{lgjwZ!oTG@4fev^XSH0wvA(%!P0w#>A zg%%mK6zH4GT_4$i7*tZT;Mlmd{Yi?&v8J2j`i?K;C`x> z&=FBic2H-v8yojnt-4-s>*~8bgg0u`D3j!^CM28kD9Dj#SYslQ&VVb87A?fr43Ezv z{e`{&83M$Yk~!y2QrGX<6+b^0iO;#<>Mxn{+sQ+zCD)FEjM4zY3G12!(Rr-0#-I#$ zYlg5$Ym|8uMs1X)dF?WObAwkJKk?4Zq>GW;(b-P!x{aSJn|&!0$-bLs%It>O%IJz( zncQfeV?RWXk`3NXa)&?4t-Q>yXTQ?hW=xgiX0oZAD`p<3pjLU7_{>Ges?sW7@VY!Du%QF^J znE=dwkqQVoVbnkPC!bFv*Ae-t0HoG|(#X`C8~RWDs434@^4n(ln_g2+r*}$&&%dXv zR=K#--BK;;R%X`!<88R~U24FN>(I>*5CQ-I05e5JGXMZ@WzUq+05EU{OWvAy?|XNP zxkVU!95xsu(~OHS4E~2o_AM)Ixi_wV&+^{@f-?X`G5}|A08$3#&Gpg)_qf&$i?IbtEaJ z@$ef%MNA?^c@UFT*Cm-3 zA)kMfwRUX}8lB;Y=f3-T=#&cwZFlL1W(wxxFxrmXMY2sAbfbSw9?0E|yVsHL8k|%k z=`$pP{fw7u{6QZ#a$nUH8nAnd{lEJ3W;ojb?B|K>4rOn0D#c=Fo^9882juj1_@|M_ zKfPb}j*kM?c4%9&yfiF7b}7_S&1;Lo+o?Y8=qiiXOW;q?_lk}k>!Y=^;cI!c=^8dT zB|gQZ&Zk__cOQ?6Ygukwz?XTi4|vl2p&v5g?a@4)#M-$B+$POPp(Rr47mGvD65T_s z5_2td)4rMW^xs`Wc`+*AubuM>Z~khGfMv2C4mZ_)C#lr@^TeUnH%b(CiLY?NWhzxm zJlN6LSn1i_yM`@4mu1QQ7D*?BoFCh{;7TF`++j^>euOAel=7Yu=Pn-Uyh`xbc`Bo) zb|06^WXBZi!JY>Q5UE=4mxs602xzb2IaIU&Hc%A>1xy36vF(t8iIEwDU9vq>oW)K# z&)b95asqCZx2|nOlhXE$NC$s0)a0+CwiMd`PKRiD%#ZkAAn~VV8-Jx@T4n~g9KM}% zxwqbs?pXL=XYRLpHog2i?{LhP23*cpuUYk|5xlfy?%aoTt-@oq30Dv4drW`Wnf)Ac zv2oHy<=C^cM42_w>@ChYZ?#<+gpU5xe<=TGnwTvDBk&oa-#HN7C;CNY()mbGYKMaZ zDyslHXybqLXLDJ`#^b!YLs9!%2SG>S?$=2t_Ua^&2Iz>_vi4r(zM(Yk09+~g71#Uc19{TU<49dpi8jel8155q7*24h7?l1wQTf55P!vfh{l$FI`}*a2y&2>B^@bnClm+~d zSfy>{ckuLO>=WQ)`k)nvhXKNyNI1UF)Ki!+*Q1?iktn~Qnpk&YPaW&@U z`q*OveJHS>9&9_0S>^Qeh3MM{$>V` zQ?YbuuwNbN9>nq3yp5a|WsSzTey7V_*ks^Io+f`$wQWT9OKfy10DqbcOQI*~B4%VP zD-f_#keFf6SH>kuS4cr${;MXw22L!cxs>Jeg7NjxKd{P6St{&_kl-R#jYncK@J+t& zsdI|hR97S)V+A(Jh=GU(5b0)N$A%FQLfLH4K{_09jDY7|PDg&yf;;>5bVLRhi>?S& z0qB3!>TwvJ^--%|F(2cnJS*hX_VfcZIE1JFS-viK+dD4a+EOhfM&F0=&c4(fZroE8 zqPhD^YP}Y>7Tm|$cX|T;2KV~NfX)wM*&oncBdJWLpV=o-6tUMT{`?9(bjJ6w>dZ}$ zEH-QU1)+Zow(QDN4cRa`49tQrFw_N)V*)(xatOnnWL9P`a~jqc`2S^$A=Ufys`kxs z0*VNxaM{6p-!L)nTzbka(A(+p7>u&lx*H&>uL8ji7FaJ?TJ>YwLC2@?688!I3Jn*s z1$%S7l!Q(K`{aRMxjzR5e{(Q&$3THw>RE%ZfIx(vQTNUdp9UjmJJ2Lj~I2& z_3)SEsH~XmV9X_7W|yk*7%aq3BgU7os3P zUr@y&eKVyigkCTxxtkq1&A-g&P7|smHli2fi$kmR*iR=VjuPMmZ$CA1;rM|5sYwi9 zd_z&W47gv8l2a=387I}pr5kU$(3jTGC6y&$Tx&BBG)7%5MjaD70>`L$9_0kZ-?yUY z-*Z{|6)3jT&0nJyr$-7_Mzhvj#L{zQ?F|9+L$02Gu8`LW@^E`QktsrIYu(&j5vP zR||g!5!5^zCSAG7W$!!Z+$i12K!`uqP*|(>2otz#fo^fMe7=k8lE0+H}wLX*UL@)H=9& z+jgSjK`>0IfCEUiwpEgs5d2#wOg1V;3YG)FrFXL*JcoJA#SBa!AMDX5BYM*fY0vep zhs}B+VbbhnTZkAP!)1QwWF^@bx>2V*jtTHs!{yODTmjqQDw*h zqCWeY8oS3W8Uc2|G49s z_ta+==LdPREF9$1MRZd9e-#geJ3!Bx62&)7k0&C`+k%`SM&B)yZvRVO1VT+cXkFN7 z+5$-GvV@o?U}htBT^W|gmG*A!5#!T%iIfCv6RVG~%+wmM7SJ(H%?Fvc-k{0NKH8E} zd0|l*6QkGAB|M%ar@`GAYYn+3~~~@J!{h5e9QXW zMY@aT`DYa`rpcP~)q3>zj?ubl*OaTZhi4B5ub?*8dIdHAjC9LgcvY&F#+oU8U^|dL zTrK6yc&o6tD^b^%7LeI*t~2aL-Sapnz{DbLJm5s7^tk^A(^drsp*OfaYs*)hw!V`Z zPK_Utt;dZ};crflo8L!;M}SI6d^|^R`zglp_RKs}p`Uzzt)>n5tA)Sz zF&8Yv&Hh};n>)1~>-irFoOpP#zj+&1kM_-?((QZ6Z|*F7US(hTm97SwYhh*nM5au= z)6X_`u&%y1%%al_tREn=7?1(hf3~xyrizsPc3!So6Ky6c?juwtyRlDXuC8lfXCMu{ zgU)8zMa&AmA?Uz-x-W660LXES>6Yyp4nWaCysqg0v81U}MEL9dbXNs(B8r-CddUY^ zs98X!VG-J722c%#ff!W{cHkTZZFdu&4tX3C;IffvZxr`-d=i!7rIS?azNEMy_0cZOlU3(kg7os4^n3au%_6xIrfJf&m_VI5JF**CcJhDXf#6O$D7z z^zD4tN3n{&y&2xiY_N!>sx0?ZMv&6qN+HczQ>kHB(m<)EK;M!l?R8o6A+a$K2lus7 zVR~T_YD3C~kN`r6Ep5jHV}VOqhILga+cjCS!>TfMS`y$TTp{VjNUxxjoeBFER4UEO zB*W=M^q1LJ2wa4yLLjBTjWU{WCxVZj0{!DydeX38qKJX5#WdJtnuMAN=0b*0HcnRT zs^*>^jajuOz_cgmD#*2^DsiE2wD`WK<^E zng)UpU?N7?!r-{_yJ%|&=)HW`7YP$#bbAZ#q?srK`X3-X^R6 zu=d`V+RsrP578wp*{;tJ;U0@FObyA&V|z2z&N}4fW$%4gPb1yyX-W8I<5m7S1ZkJr zmSHo{AuJ;Z%7{~-YYYrrLIWPkrY6bYjZ6~wLF3i`&UI=W)btMblM%oy3YZir5zBA((J>cW`xr{%Ss_b{_EBoKnOEY>EJxmANURGbqr zMKKjtSJ>fInc_JK@M^;%Vg9b~cdIC!yYsfI)6U{|?(OgSRy=?7QTQ+H=sGudyT`{a zgz4+~Q8d*8z9r;+TsR#Zz)L}oc@goj!2ptD%SdEEXc{6Kr63Gh~;PYy+#wu%C`g9Er{U#?0N(bpoe- zBI-i90&vIHBQg=?#u>w!w#qU^v}4c`wgLqWSy}`H=OUTqznS_{#Vu4TmzveKA4wJ* z1+{DjIw%askJ#Y~;PCxERa+sJJlw@^4$PhVDIqVe{|R4)4WqPdZgBggQ+i1c3!kfK zH1ucKprUyE`AXP(AO7sKdXKl6KZ}6)+?KB}yn8KLH~Fk|eg2&J4|kw0k$?p*< zCJ|P$iai2cqze#$d4%ydlqWPD!@ycpV|58oY+%Kv=6CP)r8K9hv;S(5B}YOuABF z*JDam!ck@I0K^E}35;YbgmIbX5Xu>|s>4+?u}a}DqDdGhM8@5lIZ^0WKxO6{AwhEO zDd|TcjMLpznBN_p`?AO^q%zN>1^SK;q`Ke9`{b@&ZB;A|>{*IcJLMSWRUQtH-h(Xd z=lnCjLW%k2=N1S^d99L_iHdRXk0g9aC!Ww;A!x_}h-4X=Ew*;9A}(+$L(0Ntm1{;~ zhiYaDP6_aeF+lxa19F8~CC%ex@GAtec7X+s#G|X7K9x{%ZhVn^88_umG_FtP+rC3z z)76?bUIIMSHGcHj2S0VIIHF0>8InpRyGj6Bb#4L9rI*1L7zru1G>h4EuUXl!G6FmU zecpQAx@_=|t$SOi`^*XyY>|Io27?OJ<+XJZHan?;dqUp?GX|{-5xHCw8x0FqRz)ks zA}d1+m8rISh);(+jtTI;%cFq0*AMTlY4FtYf*|0du|sGF;=Od|M*A=3bMys?XOJH( z>Rp{1O7|zvS?S(~v{H#zuHN~_>Dt>e#U_&UKQ8yVljr|2q{`~ssRG#u%aWZs-^jnq zV#v72eA@nwYogmfhbQl}1Bs($xb;P-xXVU>elZ0xmsGwE)vFw3tTO4XJ^9W_K^1B6 zD5PE!pXzU!^7WMJc$~`wD&o!?qnP7*x*F>$?begT(GkPg2zW(&mHf@Z?@S|~x0A*7 z|0&67kKHMU4LG_p{I%BzDmG1I+7 zWl#5#0Ih_nec#Jb*9z+vAEQ>Gf(bkgdY5!PQz}3wmD=T~FEokFTa#wD^frCHiaAM( zN6A}+eNo<}Cro|$#^Vo<>XV#Q;+9~NuT?c4Lo%G5kQJ7oY#0H?64pess=5{j2ANN` zsla>QBs3WN|HMMtL|`qP=%ND2a&ypoj#T%LC_}AU@{oO0yNyqk!~7>tv8GGqA5YwZ z_h=Pc`7`(NSDINKn@#s@@fP*gRR~!mEk`1K964tIV}X;%lto7TG46Fw9e|Y@|ED7h zo%b$&<(gy?b@rS6@K-c7MCMJH%7{#esu%^jhP0~~R&88`ArzV$)?$ZTWn35pc-{Gz zUKUuxmCfRTe?sNQ+u!!{RBCjX+S6)t^W9j8Ke|oEhb0%NiTJ4BMXV2|m`#q#<_N>< zLyJdmtn$zVyd&#+iR3=MxRuJX4=c zqI~+QEdO#*-{D!e5|G(=Qftlt5D*Xo0000pL`5_J0B>Ymltu%Ff@-MkUvA&s?tm+C z(}5~(6o{l2We-{O{$6^_Ow6pD#{aIAe*h360V0|JxPt?6K!~37H476UVxJq;#0UO> zSX_0g6K$~>%OacY$y}{tooz;4%>DM>%y0X@y&=K*M#PgLlNo0b(4pI;c{I znuzdPf9P8@?b=p8BpON)IYy;u92SVuL>)rNrz;^2`}WfocCnYDXRxy#@iWeksbcJ{ zc*A@dh<-A1R!2#wDSOd4-D7Sn#O0j3ey_^#u<%7b>-p0^sLN0|6PAWeL5ehmN%X(G zRTAj1ThBgK!CBfdR}ecssk<)WionnFYX`^>U77NA:uMQNU%EqUEeTW?oxh45^& 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ξiA1 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 G(RZ2V0`!vZ)sF?sd6i#SpDKihPeT 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

#z6PgXbiF4EAjQ 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≪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%0AYQE$eqh8|^~P+Wg~5tpWFg(lJgq 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

SoY7MCn|ye& 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

jrBBoTk3H2O?P-zE9EBO8#ZOHtH!tbs`= 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 z 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

bsAm~zF(w~n*94YzpN@qdFV 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

mij%NmzF1i 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

$y~tMj@>=0+LG8mnk_tM) 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 zQ>XWvbFp`NlP&oLv8Vvf000000000000000000000000000000000000000000000 P0000000000`TzjH#n?=H literal 0 HcmV?d00001 diff --git a/components/spi-st25r3911b/NDEF/include/message/ndef_buffer.h b/components/spi-st25r3911b/NDEF/include/message/ndef_buffer.h new file mode 100644 index 0000000..78ef6cd --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/message/ndef_buffer.h @@ -0,0 +1,89 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF buffer type structures + * + */ + +#ifndef NDEF_BUFFER_H +#define NDEF_BUFFER_H + + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + + +/*! NDEF structure to handle const buffers */ +typedef struct +{ + const uint8_t* buffer; /*!< Pointer to const buffer */ + uint32_t length; /*!< buffer length */ +} ndefConstBuffer; + + +/*! NDEF structure to handle buffers */ +typedef struct +{ + uint8_t* buffer; /*!< Pointer to buffer */ + uint32_t length; /*!< buffer length */ +} ndefBuffer; + + +/*! NDEF structure to handle const buffers limited to 256 bytes */ +typedef struct +{ + const uint8_t* buffer; /*!< Pointer to const buffer */ + uint8_t length; /*!< buffer length */ +} ndefConstBuffer8; + + +/*! NDEF structure to handle buffers limited to 256 bytes */ +typedef struct +{ + uint8_t* buffer; /*!< Pointer to buffer */ + uint8_t length; /*!< buffer length */ +} ndefBuffer8; + + +#endif /* NDEF_BUFFER_H */ diff --git a/components/spi-st25r3911b/NDEF/include/message/ndef_message.h b/components/spi-st25r3911b/NDEF/include/message/ndef_message.h new file mode 100644 index 0000000..4cb6976 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/message/ndef_message.h @@ -0,0 +1,211 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF message header file + * + * NDEF Message provides functionalities required to perform message management. + * A message is a list of records. + * + * The most common interfaces are: + *
  ndefMessageReset() + *
  ndefMessageAppend() + *
  ndefMessageEncode() + *
  ndefMessageDecode() + * + * \addtogroup NDEF + * @{ + * + */ + +#ifndef NDEF_MESSAGE_H +#define NDEF_MESSAGE_H + + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_config.h" + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + +/*! Message scanning macros */ +#define ndefMessageGetFirstRecord(message) (((message) == NULL) ? NULL : (message)->record) /*!< Get first record */ +#define ndefMessageGetNextRecord(record) (((record) == NULL) ? NULL : (record)->next) /*!< Get next record */ + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + + +/*! Message information */ +typedef struct +{ + uint32_t length; /*!< Message length in bytes */ + uint32_t recordCount; /*!< Number of records in the message */ +} ndefMessageInfo; + + +/*! NDEF message */ +struct ndefMessageStruct +{ + ndefRecord* record; /*!< Pointer to a record */ + ndefMessageInfo info; /*!< Message information, e.g. length in bytes, record count */ +}; + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/*! + ***************************************************************************** + * Initialize an empty NDEF message + * + * \param[in,out] message to initialize + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefMessageInit(ndefMessage* message); + + +/*! + ***************************************************************************** + * Get NDEF message information + * + * Return the message information + * + * \param[in] message to get info from + * \param[out] info: e.g. message length in bytes, number of records + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefMessageGetInfo(const ndefMessage* message, ndefMessageInfo* info); + + +/*! + ***************************************************************************** + * Get the number of NDEF message records + * + * Return the number of records in the given message + * + * \param[in] message + * + * \return number of records + ***************************************************************************** + */ +uint32_t ndefMessageGetRecordCount(const ndefMessage* message); + + +/*! + ***************************************************************************** + * Append a record to an NDEF message + * + * \param[in] record: Record to append + * \param[in,out] message: Message to be appended with the given record + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefMessageAppend(ndefMessage* message, ndefRecord* record); + + +/*! + ***************************************************************************** + * Decode a raw buffer to an NDEF message + * + * Convert a raw buffer to a message + * + * \param[in] bufPayload: Payload buffer to convert into message + * \param[out] message: Message created from the raw buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefMessageDecode(const ndefConstBuffer* bufPayload, ndefMessage* message); + + +#if NDEF_FEATURE_FULL_API +/*! + ***************************************************************************** + * Encode an NDEF message to a raw buffer + * + * Convert a message to a raw buffer + * + * \param[in] message: Message to convert + * \param[in,out] bufPayload: Output buffer to store the converted message + * The input length provides the output buffer allocated + * length, used for parameter check to avoid overflow. + * In case the buffer provided is too short, it is + * updated with the required buffer length. + * On success, it is updated with the actual buffer + * length used to contain the converted message. + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefMessageEncode(const ndefMessage* message, ndefBuffer* bufPayload); +#endif + + +#if NDEF_FEATURE_FULL_API +/*! + ***************************************************************************** + * Look for a given record type in an NDEF message + * + * Parses an NDEF message, looking for a record of given type + * + * \param[in] message: Message to parse + * \param[in] tnf: TNF type to match + * \param[in] bufType: Type buffer to match + * + * \return the record matching the type if successful or NULL + ***************************************************************************** + */ +ndefRecord* ndefMessageFindRecordType(ndefMessage* message, uint8_t tnf, const ndefConstBuffer8* bufType); +#endif + + +#endif /* NDEF_MESSAGE_H */ + +/** + * @} + * + */ diff --git a/components/spi-st25r3911b/NDEF/include/message/ndef_record.h b/components/spi-st25r3911b/NDEF/include/message/ndef_record.h new file mode 100644 index 0000000..82f3837 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/message/ndef_record.h @@ -0,0 +1,409 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF record header file + * + * + * NDEF record provides functionalities required to perform record management. + * + * + * \addtogroup NDEF + * @{ + * + */ + +#ifndef NDEF_RECORD_H +#define NDEF_RECORD_H + + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_config.h" +#include "ndef_buffer.h" + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + +#define NDEF_RECORD_HEADER_LEN 7U /*!< Record header length (sizeof(uint8_t) + sizeof(uint8_t) + sizeof(uint32_t) + sizeof(uint8_t) */ + +#define NDEF_SHORT_RECORD_LENGTH_MAX 255U /*!< Short record maximum length */ + + +/*! Type Name Format aka TNF types */ +#define NDEF_TNF_EMPTY 0U /*!< TNF Empty */ +#define NDEF_TNF_RTD_WELL_KNOWN_TYPE 1U /*!< TNF Well-known Type */ +#define NDEF_TNF_MEDIA_TYPE 2U /*!< TNF Media Type */ +#define NDEF_TNF_URI 3U /*!< TNF URI */ +#define NDEF_TNF_RTD_EXTERNAL_TYPE 4U /*!< TNF External Type */ +#define NDEF_TNF_UNKNOWN 5U /*!< TNF Unknown */ +#define NDEF_TNF_UNCHANGED 6U /*!< TNF Unchanged */ +#define NDEF_TNF_RESERVED 7U /*!< TNF Reserved */ + +#define NDEF_TNF_MASK 7U /*!< Type Name Format mask */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + +/*! Build the record header byte, made of MB, ME, CF, SR, IL bits and TNF type */ +#define ndefHeader(MB, ME, CF, SR, IL, TNF) ((((MB) & 1U) << 7U) | (((ME) & 1U) << 6U) | (((CF) & 1U) << 5U) | (((SR) & 1U) << 4U) | (((IL) & 1U) << 3U) | ((uint8_t)(TNF) & NDEF_TNF_MASK) ) /*< Build the record header byte, made of MB, ME, CF, SR, IL bits and TNF type */ + +/*! Read bits in header byte */ +#define ndefHeaderMB(record) ( ((record)->header & 0x80U) >> 7 ) /*!< Return the MB bit from the record header byte */ +#define ndefHeaderME(record) ( ((record)->header & 0x40U) >> 6 ) /*!< Return the ME bit from the record header byte */ +#define ndefHeaderCF(record) ( ((record)->header & 0x20U) >> 5 ) /*!< Return the CF bit from the record header byte */ +#define ndefHeaderSR(record) ( ((record)->header & 0x10U) >> 4 ) /*!< Return the SR bit from the record header byte */ +#define ndefHeaderIL(record) ( ((record)->header & 0x08U) >> 3 ) /*!< Return the IL bit from the record header byte */ +#define ndefHeaderTNF(record) ( (record)->header & NDEF_TNF_MASK ) /*!< Return the TNF type from the record header byte */ + +/*! Set bits in header byte */ +#define ndefHeaderSetMB(record) ( (record)->header |= (1U << 7) ) /*!< Set the MB bit in the record header byte */ +#define ndefHeaderSetME(record) ( (record)->header |= (1U << 6) ) /*!< Set the ME bit in the record header byte */ +#define ndefHeaderSetCF(record) ( (record)->header |= (1U << 5) ) /*!< Set the CF bit in the record header byte */ +#define ndefHeaderSetSR(record) ( (record)->header |= (1U << 4) ) /*!< Set the SR bit in the record header byte */ +#define ndefHeaderSetIL(record) ( (record)->header |= (1U << 3) ) /*!< Set the IL bit in the record header byte */ +#define ndefHeaderSetTNF(record, value) ( (record)->header |= (uint8_t)(value) & NDEF_TNF_MASK ) /*!< Set the TNF type in the record header byte */ + +/*! Clear bits in header byte */ +#define ndefHeaderClearMB(record) ( (record)->header &= 0x7FU ) /*!< Clear the MB bit in the record header byte */ +#define ndefHeaderClearME(record) ( (record)->header &= 0xBFU ) /*!< Clear the ME bit in the record header byte */ +#define ndefHeaderClearCF(record) ( (record)->header &= 0xDFU ) /*!< Clear the CF bit in the record header byte */ +#define ndefHeaderClearSR(record) ( (record)->header &= 0xEFU ) /*!< Clear the SR bit in the record header byte */ +#define ndefHeaderClearIL(record) ( (record)->header &= 0xF7U ) /*!< Clear the IL bit in the record header byte */ +#define ndefHeaderClearTNF(record, value) ( (record)->header &= 0xF8U ) /*!< Clear the TNF type in the record header byte */ + +/*! Set or Clear the MB/ME bit in header byte */ +#define ndefHeaderSetValueMB(record, value) do{ (record)->header &= 0x7FU; (record)->header |= (((uint8_t)(value)) & 1U) << 7; }while(0) /*!< Write the value to the MB bit in the record header byte */ +#define ndefHeaderSetValueME(record, value) do{ (record)->header &= 0xBFU; (record)->header |= (((uint8_t)(value)) & 1U) << 6; }while(0) /*!< Write the value to the ME bit in the record header byte */ +#define ndefHeaderSetValueSR(record, value) do{ (record)->header &= 0xEFU; (record)->header |= (((uint8_t)(value)) & 1U) << 4; }while(0) /*!< Write the value to the SR bit in the record header byte */ + +/*! Test bit in header byte */ +#define ndefHeaderIsSetMB(record) ( ndefHeaderMB(record) == 1U ) /*!< Return true if the Message Begin bit is set */ +#define ndefHeaderIsSetSR(record) ( ndefHeaderSR(record) == 1U ) /*!< Return true if the Short Record bit is set */ +#define ndefHeaderIsSetIL(record) ( ndefHeaderIL(record) == 1U ) /*!< Return true if the Id Length bit is set */ + + +typedef struct ndefTypeStruct ndefType; /*!< Forward declaration */ +typedef struct ndefMessageStruct ndefMessage; /*!< Forward declaration */ + +/*! Record type */ +typedef struct ndefRecordStruct +{ + uint8_t header; /*!< Header byte made of MB:1 ME:1 CF:1 SR:1 IL:1 TNF:3 => 8 bits */ + uint8_t typeLength; /*!< Type length in bytes */ + uint8_t idLength; /*!< Id Length, presence depends on the IL bit */ + const uint8_t* type; /*!< Type follows the structure implied by the value of the TNF field */ + const uint8_t* id; /*!< Id (middle and terminating record chunks MUST NOT have an ID field) */ + ndefConstBuffer bufPayload; /*!< Payload buffer. Payload length depends on the SR bit (either coded on 1 or 4 bytes) */ + + const ndefType* ndeftype; /*!< Well-known type data */ + + struct ndefRecordStruct* next; /*!< Pointer to the next record, if any */ +} ndefRecord; + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + +/*! + ***************************************************************************** + * Reset an NDEF record + * + * This function clears every record field + * + * \param[in,out] record to reset + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordReset(ndefRecord* record); + + +/*! + ***************************************************************************** + * Initialize an NDEF record + * + * This function initializes all record fields + * + * \param[in,out] record: Record to initialize + * \param[in] tnf: TNF type + * \param[in] bufType: Type buffer + * \param[in] bufId: Id buffer + * \param[in] bufPayload: Payload buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordInit(ndefRecord* record, uint8_t tnf, const ndefConstBuffer8* bufType, const ndefConstBuffer8* bufId, const ndefConstBuffer* bufPayload); + + +/*! + ***************************************************************************** + * Get NDEF record header length + * + * Return the length of header for the given record + * + * \param[in] record + * + * \return header length in bytes + ***************************************************************************** + */ +uint32_t ndefRecordGetHeaderLength(const ndefRecord* record); + + +/*! + ***************************************************************************** + * Get NDEF record length + * + * Return the length of the given record, needed to store it as a raw buffer. + * It includes the header length. + * + * \param[in] record + * + * \return record length in bytes + ***************************************************************************** + */ +uint32_t ndefRecordGetLength(const ndefRecord* record); + + +/*! + ***************************************************************************** + * Set NDEF record type + * + * Set the type for the given record + * + * \param[in,out] record: Record to set the type + * \param[in] tnf: TNF type + * \param[in] bufType: Type buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordSetType(ndefRecord* record, uint8_t tnf, const ndefConstBuffer8* bufType); + + +/*! + ***************************************************************************** + * Get NDEF record type + * + * Return the type for the given record + * + * \param[in] record: Record to get the type from + * \param[out] tnf: Pointer to the TNF type + * \param[out] bufType: Type string buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordGetType(const ndefRecord* record, uint8_t* tnf, ndefConstBuffer8* bufType); + + +/*! + ***************************************************************************** + * Check the record type matches a given type + * + * \param[in] record: Record to get the type from + * \param[out] tnf: the TNF type to compare with + * \param[out] bufType: Type string buffer to compare with + * + * \return true or false + ***************************************************************************** + */ +bool ndefRecordTypeMatch(const ndefRecord* record, uint8_t tnf, const ndefConstBuffer8* bufType); + + +/*! + ***************************************************************************** + * Set NDEF record Id + * + * Set the Id for the given NDEF record + * + * \param[in] record: Record to set the Id + * \param[out] bufId: Id buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordSetId(ndefRecord* record, const ndefConstBuffer8* bufId); + + +/*! + ***************************************************************************** + * Get NDEF record Id + * + * Return the Id for the given NDEF record + * + * \param[in] record: Record to get the Id from + * \param[out] bufId: Id buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordGetId(const ndefRecord* record, ndefConstBuffer8* bufId); + + +/*! + ***************************************************************************** + * Set NDEF record payload + * + * Set the payload for the given record, update the SR bit accordingly + * + * \param[in,out] record: Record to set the payload + * \param[in] bufPayload: Payload buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordSetPayload(ndefRecord* record, const ndefConstBuffer* bufPayload); + + +/*! + ***************************************************************************** + * Get NDEF record payload + * + * Return the payload for the given record + * + * \param[in] record: Record to get the payload from + * \param[out] bufPayload: Payload buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordGetPayload(const ndefRecord* record, ndefConstBuffer* bufPayload); + + +/*! + ***************************************************************************** + * Decode a raw buffer to create an NDEF record + * + * Convert a raw buffer to a record + * + * \param[in] bufPayload: Payload buffer to convert into record + * \param[out] record: Record created from the raw buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordDecode(const ndefConstBuffer* bufPayload, ndefRecord* record); + + +#if NDEF_FEATURE_FULL_API +/*! + ***************************************************************************** + * Encode an NDEF record header to a raw buffer + * + * Convert a record header to a raw buffer. It is made of: + * "header byte" (1 byte), type length (1 byte), + * payload length (4 bytes), Id length (1 byte). + * Total 7 bytes. + * + * \param[in] record: Record header to convert + * \param[in,out] bufHeader: Output buffer to store the converted record header + * The input length provides the output buffer allocated + * length, used for parameter check to avoid overflow. + * In case the buffer provided is too short, it is + * updated with the required buffer length. + * On success, it is updated with the actual buffer + * length used to contain the converted record. + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordEncodeHeader(const ndefRecord* record, ndefBuffer* bufHeader); + + +/*! + ***************************************************************************** + * Encode an NDEF record to a raw buffer + * + * Convert a record to a raw buffer + * + * \param[in] record: Record to convert + * \param[in,out] bufRecord: Output buffer to store the converted record + * The input length provides the output buffer allocated + * length, used for parameter check to avoid overflow. + * In case the buffer provided is too short, it is + * updated with the required buffer length. + * On success, it is updated with the actual buffer + * length used to contain the converted record. + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordEncode(const ndefRecord* record, ndefBuffer* bufRecord); +#endif + + +/*! + ***************************************************************************** + * Get NDEF record payload length + * + * Return the length of payload for the given record + * + * \param[in] record + * + * \return payload length in bytes + ***************************************************************************** + */ +uint32_t ndefRecordGetPayloadLength(const ndefRecord* record); + + +/*! + ***************************************************************************** + * Return a payload elementary item needed to build the complete record payload + * + * Call this function to get either the first payload item, or the next one. + * Returns the next payload item, call it until it returns NULL. + * + * \param[in] record: Record + * \param[out] bufPayloadItem: The payload item returned + * \param[in] begin: Tell to return the first payload item or the next one + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +const uint8_t* ndefRecordGetPayloadItem(const ndefRecord* record, ndefConstBuffer* bufPayloadItem, bool begin); + + +#endif /* NDEF_RECORD_H */ + +/** + * @} + * + */ diff --git a/components/spi-st25r3911b/NDEF/include/message/ndef_type_aar.h b/components/spi-st25r3911b/NDEF/include/message/ndef_type_aar.h new file mode 100644 index 0000000..03a1d92 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/message/ndef_type_aar.h @@ -0,0 +1,143 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF RTD Android Application Record (AAR) type header file + * + * NDEF RTD provides functionalities to handle RTD AAR records. + * + * \addtogroup NDEF + * @{ + * + */ + +#ifndef NDEF_TYPE_AAR_H +#define NDEF_TYPE_AAR_H + + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_buffer.h" + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + +/*! RTD Record Type buffers */ +extern const ndefConstBuffer8 bufRtdTypeAar; /*! AAR (Android Application Record) Record Type buffer */ + + +/*! RTD Android Application Record External Type */ +typedef struct +{ + ndefConstBuffer8 bufType; /*!< AAR type */ + ndefConstBuffer bufPayload; /*!< AAR payload */ +} ndefTypeRtdAar; + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/******************* + * AAR External Type + ******************* + */ + +/*! + ***************************************************************************** + * Initialize an RTD Android Application Record External type + * + * \param[out] aar: Type to initialize + * \param[in] bufPayload: Payload buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdAarInit(ndefType* aar, const ndefConstBuffer* bufPayload); + + +/*! + ***************************************************************************** + * Get RTD Android Application Record type content + * + * \param[in] aar: Type to get information from + * \param[out] bufAarString: AAR string buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefGetRtdAar(const ndefType* aar, ndefConstBuffer* bufAarString); + + +/*! + ***************************************************************************** + * Convert an NDEF record to an RTD Android Application Record External type + * + * \param[in] record: Record to convert + * \param[out] aar: The converted AAR external type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordToRtdAar(const ndefRecord* record, ndefType* aar); + + +/*! + ***************************************************************************** + * Convert an RTD Android Application Record External type to an NDEF record + * + * \param[in] aar: AAR External type to convert + * \param[out] record: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdAarToRecord(const ndefType* aar, ndefRecord* record); + + +#endif /* NDEF_TYPE_AAR_H */ + +/** + * @} + * + */ diff --git a/components/spi-st25r3911b/NDEF/include/message/ndef_type_bluetooth.h b/components/spi-st25r3911b/NDEF/include/message/ndef_type_bluetooth.h new file mode 100644 index 0000000..6e57077 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/message/ndef_type_bluetooth.h @@ -0,0 +1,425 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2020 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF Bluetooth type header file + * + * It provides functionalities to handle Bluetooth Out-Of-Band NDEF records, + * to start a communication based on Bluetooth. + * + * The Bluetooth OOB format is described by the Bluetooth v4.0 core specification. + * It consists in a list of Extended Inquiry Responses (EIRs) formated as length-type-value. + * + * \addtogroup NDEF + * @{ + * + */ + +#ifndef NDEF_TYPE_BLUETOOTH_H +#define NDEF_TYPE_BLUETOOTH_H + + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_buffer.h" + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + +#define NDEF_BT_EIR_DEVICE_ADDRESS_TYPE_OFFSET 6U /*!< Device Address Type (Public, Random) offset */ + + +/*!< Number of EIRs that can be decoded simultaneously + Allow to control the number of allocated memory space to store decoded EIRs + Should be lower or equal to the number of known EIRs (currently 26) +*/ +#define NDEF_BT_EIR_COUNT 8U /*!< Number of EIRs that can be decoded */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + + +/*! Bluetooth LE address types */ +typedef enum +{ + NDEF_BLE_PUBLIC_ADDRESS_TYPE = 0x0U, /*!< Public Device Address */ + NDEF_BLE_RANDOM_ADDRESS_TYPE = 0x1U, /*!< Random Device Address */ + NDEF_BLE_UNDEF_ADDRESS_TYPE = 0xFFU /*!< Device Address is undefined */ +} ndefBluetoothLEAddressType; + + +/*! Bluetooth LE roles */ +typedef enum +{ + NDEF_BLE_ROLE_PERIPH_ONLY = 0x0U, /*!< Only Peripheral Role supported */ + NDEF_BLE_ROLE_CENTRAL_ONLY = 0x1U, /*!< Only Central Role supported */ + NDEF_BLE_ROLE_PERIPH_PREFERRED = 0x2U, /*!< Peripheral and Central Role supported, Peripheral Role preferred for connection establishment */ + NDEF_BLE_ROLE_CENTRAL_PREFERRED = 0x3U, /*!< Peripheral and Central Role supported, Central Role preferred for connection establishment */ + NDEF_BLE_ROLE_UNDEF = 0xFFU /*!< LE Role is undefined */ +} ndefBluetoothLERole; + + +/*! Extended Inquiry Responses, as defined in the Bluetooth v4.0 Core Specification */ +#define NDEF_BT_EIR_FLAGS 0x01U /*!< Bluetooth flags:\n + b0: LE limited Discoverable Mode, + b1: LE general Discoverable Mode, + b2: BR/EDR not supported, + b3: Simultaneous LE & BR/EDR Conroller, + b4: Simultaneous LE & BR/EDR Host */ +#define NDEF_BT_EIR_SERVICE_CLASS_UUID_PARTIAL_16 0x02U /*!< Bluetooth service UUID on 16-bits (partial list) */ +#define NDEF_BT_EIR_SERVICE_CLASS_UUID_COMPLETE_16 0x03U /*!< Bluetooth service UUID on 16-bits (complete list) */ +#define NDEF_BT_EIR_SERVICE_CLASS_UUID_PARTIAL_32 0x04U /*!< Bluetooth service UUID on 32-bits (partial list) */ +#define NDEF_BT_EIR_SERVICE_CLASS_UUID_COMPLETE_32 0x05U /*!< Bluetooth service UUID on 32-bits (complete list) */ +#define NDEF_BT_EIR_SERVICE_CLASS_UUID_PARTIAL_128 0x06U /*!< Bluetooth service UUID on 128-bits (partial list) */ +#define NDEF_BT_EIR_SERVICE_CLASS_UUID_COMPLETE_128 0x07U /*!< Bluetooth service UUID on 128-bits (complete list) */ +#define NDEF_BT_EIR_SHORT_LOCAL_NAME 0x08U /*!< Shortened local name */ +#define NDEF_BT_EIR_COMPLETE_LOCAL_NAME 0x09U /*!< Complete local name */ +#define NDEF_BT_EIR_TX_POWER_LEVEL 0x0AU /*!< TX Power Level (1 byte): 0xXX:-127 to +127dBm */ +#define NDEF_BT_EIR_DEVICE_CLASS 0x0DU /*!< Class of device, Format defined in Assigned Numbers */ +#define NDEF_BT_EIR_SIMPLE_PAIRING_HASH 0x0EU /*!< Simple Pairing Hash C (16 octets), Format defined in [Vol. 2], Part H Section 7.2.2 */ +#define NDEF_BT_EIR_SIMPLE_PAIRING_RANDOMIZER 0x0FU /*!< Simple Pairing Randomizer R (16 octets), Format defined in[Vol. 2], Part H Section 7.2.2 */ +#define NDEF_BT_EIR_SECURITY_MANAGER_TK_VALUE 0x10U /*!< TK Value: Value as used in pairing over LE Physical channel. Format defined in [Vol. 3], Part H Section 2.3 */ +#define NDEF_BT_EIR_SECURITY_MANAGER_FLAGS 0x11U /*!< Flags (1 octet):\n + b0: OOB Flags Field (0 = OOB data not present, 1 = OOB data present), + b1: LE supported (Host) (i.e. bit 65 of LMP Extended Feature bits Page 1), + b2: Simultaneous LE and BR/EDR to Same Device Capable (Host) (i.e. bit 66 of LMP Extended Feature bits Page 1) + b3: Address type (0 = Public Address, 1 = Random Address) */ +#define NDEF_BT_EIR_SLAVE_CONNECTION_INTERVAL_RANGE 0x12U /*!< Slave Connection Interval Range: The first 2 octets define the minimum value for the connection interval, The second 2 octets define the maximum value for the connection interval */ +#define NDEF_BT_EIR_SERVICE_SOLICITATION_16 0x14U /*!< Service UUIDs: List of 16 bit Service UUIDs */ +#define NDEF_BT_EIR_SERVICE_SOLICITATION_128 0x15U /*!< Service UUIDs: List of 128 bit Service UUIDs */ +#define NDEF_BT_EIR_SERVICE_DATA 0x16U /*!< Service Data (2 or more octets): The first 2 octets contain the 16 bit Service UUID followed by additional service data */ +#define NDEF_BT_EIR_APPEARANCE 0x19U /*!< UUID for `Appearance`: The Appearance characteristic value shall be the enumerated value as defined by Bluetooth Assigned Numbers document */ +#define NDEF_BT_EIR_LE_DEVICE_ADDRESS 0x1BU /*!< 6 LSB bytes: Device address, 7th byte: Address type (Public/Random) */ +#define NDEF_BT_EIR_LE_ROLE 0x1CU /*!< Device Role: Periph only, Central only, Periph prefered, Central prefered */ +#define NDEF_BT_EIR_LE_SECURE_CONN_CONFIRMATION_VALUE 0x22U /*!< Secure Connection Confirmation value */ +#define NDEF_BT_EIR_LE_SECURE_CONN_RANDOM_VALUE 0x23U /*!< Secure Connection Random value */ +#define NDEF_BT_EIR_MANUFACTURER_DATA 0xFFU /*!< Manufacturer Specific Data (2 or more octets): The first 2 octets contain the Company Identifier Code followed by additional manufacturer specific data */ + + +/*! Bluetooth Out-Of-Band data structure + * Some fields are shared by both Br/Edr & LE Bluetooth, some are specific. + */ +typedef struct +{ + /* Mandatory fields: + bufDeviceAddress + Optional common fields: + NDEF_BT_EIR_FLAGS + NDEF_BT_EIR_SERVICE_CLASS_UUID_PARTIAL_16 + NDEF_BT_EIR_SERVICE_CLASS_UUID_COMPLETE_16 + NDEF_BT_EIR_SERVICE_CLASS_UUID_PARTIAL_32 + NDEF_BT_EIR_SERVICE_CLASS_UUID_COMPLETE_32 + NDEF_BT_EIR_SERVICE_CLASS_UUID_PARTIAL_128 + NDEF_BT_EIR_SERVICE_CLASS_UUID_COMPLETE_128 + NDEF_BT_EIR_SHORT_LOCAL_NAME + NDEF_BT_EIR_COMPLETE_LOCAL_NAME + NDEF_BT_EIR_TX_POWER_LEVEL + NDEF_BT_EIR_DEVICE_CLASS + NDEF_BT_EIR_SECURITY_MANAGER_FLAGS + NDEF_BT_EIR_SLAVE_CONNECTION_INTERVAL_RANGE + NDEF_BT_EIR_SERVICE_SOLICITATION_16 + NDEF_BT_EIR_SERVICE_SOLICITATION_128 + NDEF_BT_EIR_SERVICE_DATA + For Br/Edr only: + NDEF_BT_EIR_SIMPLE_PAIRING_HASH + NDEF_BT_EIR_SIMPLE_PAIRING_RANDOMIZER + BLE mandatory fields: + NDEF_BT_EIR_LE_ROLE + BLE optional fields: + NDEF_BT_EIR_LE_SECURE_CONN_CONFIRMATION_VALUE + NDEF_BT_EIR_LE_SECURE_CONN_RANDOM_VALUE + NDEF_BT_EIR_SECURITY_MANAGER_TK_VALUE + NDEF_BT_EIR_APPEARANCE + NDEF_BT_EIR_MANUFACTURER_DATA */ + + ndefConstBuffer bufDeviceAddress; /*!< Device address, for BR/EDR only */ + + const uint8_t* eir[NDEF_BT_EIR_COUNT]; /*!< Array containg pointer to each EIR */ + +} ndefTypeBluetooth; + + +/*! Bluetooth Record Type buffers */ +extern const ndefConstBuffer8 bufMediaTypeBluetoothBrEdr; /*! Bluetooth BR/EDR Out-Of-Band Record Type buffer */ +extern const ndefConstBuffer8 bufMediaTypeBluetoothLe; /*! Bluetooth Low Energy Record Type buffer */ +extern const ndefConstBuffer8 bufMediaTypeBluetoothSecureBrEdr; /*! Bluetooth Secure BR/EDR Record Type buffer */ +extern const ndefConstBuffer8 bufMediaTypeBluetoothSecureLe; /*! Bluetooth Secure Low Energy Record Type buffer */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/*************** + * Bluetooth + *************** + */ + + +/*! + ***************************************************************************** + * Get Bluetooth EIR length + * + * \param[in] eir: Extended Inquiry Response + * + * \return the length of the EIR passed as parameter + ***************************************************************************** + */ +uint8_t ndefBluetoothEirLength(const uint8_t* eir); + + +/*! + ***************************************************************************** + * Get Bluetooth EIR data length + * + * \param[in] eir: Extended Inquiry Response + * + * \return the length of the data contained in the EIR passed as parameter + ***************************************************************************** + */ +uint8_t ndefBluetoothEirDataLength(const uint8_t* eir); + + +/*! + ***************************************************************************** + * Get Bluetooth EIR type + * + * \param[in] eir: Extended Inquiry Response + * + * \return the type of the EIR passed as parameter + ***************************************************************************** + */ +uint8_t ndefBluetoothEirType(const uint8_t* eir); + +/*! + ***************************************************************************** + * Get a pointer to a Bluetooth EIR data + * + * \param[in] eir: Extended Inquiry Response + * + * \return a pointer to the data of the EIR passed as parameter + ***************************************************************************** + */ +const uint8_t* ndefBluetoothEirData(const uint8_t* eir); + + +/*! + ***************************************************************************** + * Convert a Bluetooth EIR to an ndefBuffer structure + * + * \param[in] eir: Extended Inquiry Response + * \param[in,out] bufEir: pointer to the Extended Inquiry Response data + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefBluetoothEirDataToBuffer(const uint8_t* eir, ndefConstBuffer* bufEir); + + +/*! + ***************************************************************************** + * Add a Bluetooth EIR to the bluetooth type + * + * \param[in] bluetooth: Bluetooth type + * \param[in] eir: EIR type to add + * + * Add eir after any EIR already listed in the bluetooth type, + * or replace in case an EIR with matching type is already there. + * + * \return ERR_NONE if successful, ERR_NOMEM or a standard error code + ***************************************************************************** + */ +ndefStatus ndefBluetoothSetEir(ndefTypeBluetooth* bluetooth, const uint8_t* eir); + + +/*! + ***************************************************************************** + * Get a pointer to a Bluetooth EIR + * + * \param[in] bluetooth: Bluetooth type + * \param[in] eirType: EIR type to find + * + * \return a pointer to the EIR matching the type, or NULL + ***************************************************************************** + */ +const uint8_t* ndefBluetoothGetEir(const ndefTypeBluetooth* bluetooth, uint8_t eirType); + + +/*! + ***************************************************************************** + * Return an EIR content + * + * \param[in] bluetooth: Bluetooth type + * \param[in] eirType: EIR type to retrieve + * \param[out] bufData: NDEF buffer pointing to the EIR data + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefBluetoothGetEirData(const ndefTypeBluetooth* bluetooth, uint8_t eirType, ndefConstBuffer* bufData); + + +/*! + ***************************************************************************** + * Copy an EIR content with bytes in reversed order in the ndefBuffer + * + * \param[in] bluetooth: Bluetooth type + * \param[in] eirType: EIR type to retrieve + * \param[out] bufDataReversed: NDEF buffer to store the reversed EIR + * + * In case the NDEF buffer is not long enough, its length is updated with + * the actual length required and the function returns ERR_NOMEM. + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefBluetoothGetEirDataReversed(const ndefTypeBluetooth* bluetooth, uint8_t eirType, ndefBuffer* bufDataReversed); + + +/*! + ***************************************************************************** + * Reset a Bluetooth type + * + * \param[in] bluetooth: Bluetooth type + * + * This function resets each field of the ndefTypeBluetooth structure + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefBluetoothReset(ndefTypeBluetooth* bluetooth); + + +/*! + ***************************************************************************** + * Initialize a Bluetooth Basic Rate/Enhanced Data Rate type + * + * \param[out] type: Type to initialize + * \param[in] bluetooth: Bluetooth type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefBluetoothBrEdrInit(ndefType* type, const ndefTypeBluetooth* bluetooth); + + +/*! + ***************************************************************************** + * Initialize a Bluetooth Low Energy type + * + * \param[out] type: Type to initialize + * \param[in] bluetooth: Bluetooth type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefBluetoothLeInit(ndefType* type, const ndefTypeBluetooth* bluetooth); + + +/*! + ***************************************************************************** + * Initialize a Bluetooth Secure BR/EDR type + * + * \param[out] type: Type to initialize + * \param[in] bluetooth: Bluetooth type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefBluetoothSecureBrEdrInit(ndefType* type, const ndefTypeBluetooth* bluetooth); + + +/*! + ***************************************************************************** + * Initialize a Bluetooth Secure Low Energy type + * + * \param[out] type: Type to initialize + * \param[in] bluetooth: Bluetooth type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefBluetoothSecureLeInit(ndefType* type, const ndefTypeBluetooth* bluetooth); + + +/*! + ***************************************************************************** + * Get Bluetooth type content + * + * \param[in] type: Type to get information from + * \param[out] bluetooth: Bluetooth type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefGetBluetooth(const ndefType* type, ndefTypeBluetooth* bluetooth); + + +/*! + ***************************************************************************** + * Convert an NDEF record to a Bluetooth type + * + * \param[in] record: Record to convert + * \param[out] type: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordToBluetooth(const ndefRecord* record, ndefType* type); + + +/*! + ***************************************************************************** + * Convert a Bluetooth type to an NDEF record + * + * \param[in] type: Type to convert + * \param[out] record: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefBluetoothToRecord(const ndefType* type, ndefRecord* record); + + +#endif /* NDEF_TYPE_BLUETOOTH_H */ + +/** + * @} + * + */ diff --git a/components/spi-st25r3911b/NDEF/include/message/ndef_type_deviceinfo.h b/components/spi-st25r3911b/NDEF/include/message/ndef_type_deviceinfo.h new file mode 100644 index 0000000..82f8de3 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/message/ndef_type_deviceinfo.h @@ -0,0 +1,165 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF RTD Device Information type header file + * + * NDEF RTD provides functionalities to handle RTD Device Information records. + * + * \addtogroup NDEF + * @{ + * + */ + +#ifndef NDEF_TYPE_RTD_DEVICE_INFO_H +#define NDEF_TYPE_RTD_DEVICE_INFO_H + + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_buffer.h" + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/*! Device Information defines */ +#define NDEF_UUID_LENGTH 16U /*!< Device Information UUID length */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + +/*! RTD Device Information Record Type buffer */ +extern const ndefConstBuffer8 bufRtdTypeDeviceInfo; /*! Device Information Record Type buffer */ + + +/*! RTD Device Information types */ +#define NDEF_DEVICE_INFO_MANUFACTURER_NAME 0U /*!< Manufacturer name */ +#define NDEF_DEVICE_INFO_MODEL_NAME 1U /*!< Model name */ +#define NDEF_DEVICE_INFO_DEVICE_UNIQUE_NAME 2U /*!< Device Unique Name aka "Friendly Name" */ +#define NDEF_DEVICE_INFO_UUID 3U /*!< UUID */ +#define NDEF_DEVICE_INFO_FIRMWARE_VERSION 4U /*!< Firmware Version */ +#define NDEF_DEVICE_INFO_TYPE_COUNT 5U /*!< Maximum Device Information types */ + + +/*! RTD Device Information Entry */ +typedef struct +{ + uint8_t type; /*!< Device Information Type */ + uint8_t length; /*!< Device Information length */ + const uint8_t* buffer; /*!< Device Information pointer to buffer */ +} ndefDeviceInfoEntry; + + +/*! RTD Type Device Information */ +typedef struct +{ + ndefDeviceInfoEntry devInfo[NDEF_DEVICE_INFO_TYPE_COUNT]; /*!< Device Information entries */ +} ndefTypeRtdDeviceInfo; + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/********************* + * Device Information + ********************* + */ + + +/*! + ***************************************************************************** + * Initialize a RTD Device Information type + * + * \param[out] devInfo: Type to initialize + * \param[in] devInfoData: Device Information data + * \param[in] devInfoDataCount: Number of Device Information data + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdDeviceInfoInit(ndefType* devInfo, const ndefDeviceInfoEntry* devInfoData, uint8_t devInfoDataCount); + + +/*! + ***************************************************************************** + * Get RTD Device Information type content + * + * \param[in] devInfo: Type to get information from + * \param[out] devInfoData: Device Information data + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefGetRtdDeviceInfo(const ndefType* devInfo, ndefTypeRtdDeviceInfo* devInfoData); + + +/*! + ***************************************************************************** + * Convert an NDEF record to a Device Information RTD type + * + * \param[in] record: Record to convert + * \param[out] devInfo: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordToRtdDeviceInfo(const ndefRecord* record, ndefType* devInfo); + + +/*! + ***************************************************************************** + * Convert a Device Information RTD type to an NDEF record + * + * \param[in] devInfo: Type to convert + * \param[out] record: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdDeviceInfoToRecord(const ndefType* devInfo, ndefRecord* record); + + +#endif /* NDEF_TYPE_RTD_DEVICE_INFO_H */ + +/** + * @} + * + */ diff --git a/components/spi-st25r3911b/NDEF/include/message/ndef_type_empty.h b/components/spi-st25r3911b/NDEF/include/message/ndef_type_empty.h new file mode 100644 index 0000000..237a5db --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/message/ndef_type_empty.h @@ -0,0 +1,118 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2020 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF Empty type header file + * + * NDEF RTD provides functionalities to handle empty records. + * + * \addtogroup NDEF + * @{ + * + */ + +#ifndef NDEF_TYPE_EMPTY_H +#define NDEF_TYPE_EMPTY_H + + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_buffer.h" + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/*************** + * Empty type + *************** + */ + +/*! + ***************************************************************************** + * Initialize an Empty type + * + * \param[out] empty: Type to initialize + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefEmptyTypeInit(ndefType* empty); + + +/*! + ***************************************************************************** + * Convert an NDEF record to an Empty type + * + * \param[in] record: Record to convert + * \param[out] empty: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordToEmptyType(const ndefRecord* record, ndefType* empty); + + +/*! + ***************************************************************************** + * Convert an Empty type to an NDEF record + * + * \param[in] empty: Type to convert + * \param[out] record: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefEmptyTypeToRecord(const ndefType* empty, ndefRecord* record); + + +#endif /* NDEF_TYPE_EMPTY_H */ + +/** + * @} + * + */ diff --git a/components/spi-st25r3911b/NDEF/include/message/ndef_type_flat.h b/components/spi-st25r3911b/NDEF/include/message/ndef_type_flat.h new file mode 100644 index 0000000..1e0ca73 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/message/ndef_type_flat.h @@ -0,0 +1,132 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2020 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF Flat payload type header file + * + * NDEF RTD provides functionalities to handle flat payload records. + * + * \addtogroup NDEF + * @{ + * + */ + +#ifndef NDEF_TYPE_FLAT_H +#define NDEF_TYPE_FLAT_H + + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_buffer.h" + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/*************** + * Flat type + *************** + */ + +/*! + ***************************************************************************** + * Initialize a flat payload type + * + * \param[out] type: Type to initialize + * \param[in] bufPayload: Payload buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefFlatPayloadTypeInit(ndefType* type, const ndefConstBuffer* bufPayload); + + +/*! + ***************************************************************************** + * Initialize a flat payload type + * + * \param[out] type: Type to get data from + * \param[in] bufPayload: Payload buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefGetFlatPayloadType(const ndefType* type, ndefConstBuffer* bufPayload); + + +/*! + ***************************************************************************** + * Convert an NDEF record to a flat payload type + * + * \param[in] record: Record to convert + * \param[out] type: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordToFlatPayloadType(const ndefRecord* record, ndefType* type); + + +/*! + ***************************************************************************** + * Convert a flat payload type to an NDEF record + * + * \param[in] type: Type to convert + * \param[out] record: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefFlatPayloadTypeToRecord(const ndefType* type, ndefRecord* record); + + +#endif /* NDEF_TYPE_FLAT_H */ + +/** + * @} + * + */ diff --git a/components/spi-st25r3911b/NDEF/include/message/ndef_type_media.h b/components/spi-st25r3911b/NDEF/include/message/ndef_type_media.h new file mode 100644 index 0000000..1f86fc1 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/message/ndef_type_media.h @@ -0,0 +1,142 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF MIME Media type header file + * + * NDEF MIME type provides functionalities to handle generic MIME Media records. + * + * \addtogroup NDEF + * @{ + * + */ + +#ifndef NDEF_TYPE_MEDIA_H +#define NDEF_TYPE_MEDIA_H + + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_buffer.h" + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + + +/*! Media Type */ +typedef struct +{ + ndefConstBuffer8 bufType; /*!< Media type */ + ndefConstBuffer bufPayload; /*!< Media payload */ +} ndefTypeMedia; + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/*************** + * Media + *************** + */ + +/*! + ***************************************************************************** + * Initialize a Media type + * + * \param[out] media: Media type to initialize + * \param[in] bufType: Type buffer + * \param[in] bufPayload: Payload buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefMediaInit(ndefType* media, const ndefConstBuffer8* bufType, const ndefConstBuffer* bufPayload); + + +/*! + ***************************************************************************** + * Get Media type content + * + * \param[in] media: Media type to get information from + * \param[out] bufType: Type buffer + * \param[out] bufPayload: Payload buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefGetMedia(const ndefType* media, ndefConstBuffer8* bufType, ndefConstBuffer* bufPayload); + + +/*! + ***************************************************************************** + * Convert an NDEF record to a Media type + * + * \param[in] record: Record to convert + * \param[out] media: The converted Media type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordToMedia(const ndefRecord* record, ndefType* media); + + +/*! + ***************************************************************************** + * Convert a Media type to an NDEF record + * + * \param[in] media: Type to convert + * \param[out] record: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefMediaToRecord(const ndefType* media, ndefRecord* record); + + +#endif /* NDEF_TYPE_MEDIA_H */ + +/** + * @} + * + */ diff --git a/components/spi-st25r3911b/NDEF/include/message/ndef_type_text.h b/components/spi-st25r3911b/NDEF/include/message/ndef_type_text.h new file mode 100644 index 0000000..814e796 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/message/ndef_type_text.h @@ -0,0 +1,157 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF RTD Text type header file + * + * NDEF RTD provides functionalities to handle RTD Text records. + * + * \addtogroup NDEF + * @{ + * + */ + +#ifndef NDEF_TYPE_RTD_TEXT_H +#define NDEF_TYPE_RTD_TEXT_H + + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_buffer.h" + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + +/*! RTD Text Record Type buffer */ +extern const ndefConstBuffer8 bufRtdTypeText; /*! Text Record Type buffer */ + + +/*! RTD Type Text Encoding */ +#define TEXT_ENCODING_UTF8 0U /*!< UTF8 text encoding */ +#define TEXT_ENCODING_UTF16 1U /*!< UTF16 text encoding */ + +#define NDEF_TEXT_ENCODING_MASK 0x80U /*!< Text encoding mask */ +#define NDEF_TEXT_ENCODING_SHIFT 7U /*!< Text encoding bit shift */ + + +/*! RTD Type Text */ +typedef struct +{ + uint8_t status; /*!< Status byte */ + ndefConstBuffer8 bufLanguageCode; /*!< ISO/IANA language code buffer */ + ndefConstBuffer bufSentence; /*!< Sentence buffer */ +} ndefTypeRtdText; + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/*************** + * Text + *************** + */ + + +/*! + ***************************************************************************** + * Initialize a Text RTD type + * + * \param[out] text: Type to initialize + * \param[out] utfEncoding: UTF-8/UTF-16 + * \param[in] bufLanguageCode: ISO/IANA language code buffer + * \param[in] bufSentence: Actual text buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdTextInit(ndefType* text, uint8_t utfEncoding, const ndefConstBuffer8* bufLanguageCode, const ndefConstBuffer* bufSentence); + + +/*! + ***************************************************************************** + * Get RTD Text type content + * + * \param[in] text: Type to get information from + * \param[out] utfEncoding: UTF-8/UTF-16 + * \param[out] bufLanguageCode: ISO/IANA language code buffer + * \param[out] bufSentence: Actual text buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefGetRtdText(const ndefType* text, uint8_t* utfEncoding, ndefConstBuffer8* bufLanguageCode, ndefConstBuffer* bufSentence); + + +/*! + ***************************************************************************** + * Convert an NDEF record to a Text type + * + * \param[in] record: Record to convert + * \param[out] text: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordToRtdText(const ndefRecord* record, ndefType* text); + + +/*! + ***************************************************************************** + * Convert a Text RTD type to an NDEF record + * + * \param[in] text: Type to convert + * \param[out] record: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdTextToRecord(const ndefType* text, ndefRecord* record); + + +#endif /* NDEF_TYPE_RTD_TEXT_H */ + +/** + * @} + * + */ diff --git a/components/spi-st25r3911b/NDEF/include/message/ndef_type_tnep.h b/components/spi-st25r3911b/NDEF/include/message/ndef_type_tnep.h new file mode 100644 index 0000000..b49f6c1 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/message/ndef_type_tnep.h @@ -0,0 +1,323 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF TNEP (Tag NDEF Exchange Protocol record) types header file + * + * NDEF TNEP provides functionalities to handle TNEP records: Service Parameter, Service Select and Status. + * + * \addtogroup NDEF + * @{ + * + */ + +#ifndef NDEF_TYPES_TNEP_H +#define NDEF_TYPES_TNEP_H + + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_buffer.h" + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/*! RTD TNEP defines */ +#define TNEP_VERSION_V1_0 0x10U /*!< TNEP version */ +#define TNEP_COMMUNICATION_MODE_SINGLE_RESPONSE 0x00U /*!< Single Response Communication mode */ +#define TNEP_COMMUNICATION_MODE_SPECIFIC 0xFEU /*!< Specific Communication mode */ +#define TNEP_STATUS_TYPE_SUCCESS 0U /*!< Status type Success */ +#define TNEP_STATUS_TYPE_PROTOCOL_ERROR 1U /*!< Status type Protocol Error */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + + +/*! RTD TNEP Service Parameter */ +typedef struct +{ + ndefConstBuffer bufServiceNameUri; /*!< Service Name URI string buffer */ + uint8_t tnepVersion; /*!< TNEP version */ + uint8_t communicationMode; /*!< TNEP communication mode */ + uint8_t minimumWaitingTime; /*!< Minimum Waiting Time WT_INT */ + uint8_t maximumWaitingTimeExtensions; /*!< Maximum number of waiting time extensions */ + uint8_t maximumNdefMessageSize[2]; /*!< Maximum NDEF message size (Big Endian) */ +} ndefTypeRtdTnepServiceParameter; + + +/*! RTD TNEP Service Select */ +typedef struct +{ + ndefConstBuffer bufServiceNameUri; /*!< Service Name URI string buffer */ +} ndefTypeRtdTnepServiceSelect; + + +/*! RTD TNEP Status */ +typedef struct +{ + uint8_t statusType; /*!< Status type */ +} ndefTypeRtdTnepStatus; + + +/*! RTD TNEP Record Type buffers */ +extern const ndefConstBuffer8 bufRtdTypeTnepServiceParameter; /*! TNEP Service Parameter buffer */ +extern const ndefConstBuffer8 bufRtdTypeTnepServiceSelect; /*! TNEP Service Select buffer */ +extern const ndefConstBuffer8 bufRtdTypeTnepStatus; /*! TNEP Status buffer */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/************************* + * TNEP Service Parameter + ************************* + */ + + +/*! + ***************************************************************************** + * Computes the TNEP Service Parameter WT_INT from the Twait value (in ms) + * + * \param[in] twait: minimum waiting time between last TNEP write and next TNEP read + * + * \return WT_INT value corresponding to the Twait + ***************************************************************************** + */ +uint8_t ndefRtdTnepServiceParameterComputeWtInt(float twait); + + +/*! + ***************************************************************************** + * Computes the TNEP Service Parameter Twait (in ms) from the WT_INT value + * + * \param[in] wtInt: NDEF Record field WT_INT defining the Twait + * + * \return Twait minimum waiting time between last TNEP write and next TNEP read + ***************************************************************************** + */ +float ndefRtdTnepServiceParameterComputeTwait(uint8_t wtInt); + + +/*! + ***************************************************************************** + * Initialize a TNEP Service Parameter RTD type + * + * \param[out] type: Type to initialize + * \param[in] tnepVersion: TNEP version + * \param[in] bufServiceUri: TNEP Service Name URI string buffer + * \param[in] comMode: TNEP Communication Mode + * \param[in] minWaitingTime: Minimum Waiting Time + * \param[in] maxExtensions: Maximum Waiting Time Extensions + * \param[in] maxMessageSize: Maximum NDEF Message Size (in bytes) + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdTnepServiceParameterInit(ndefType* type, uint8_t tnepVersion, const ndefConstBuffer* bufServiceUri, uint8_t comMode, uint8_t minWaitingTime, uint8_t maxExtensions, uint16_t maxMessageSize); + + +/*! + ***************************************************************************** + * Get TNEP Service Parameter RTD type content + * + * \param[in] type: Type to get information from + * \param[out] tnepVersion: TNEP version + * \param[out] bufServiceUri: TNEP Service Name URI string buffer + * \param[out] comMode: TNEP Communication Mode + * \param[out] minWaitingTime: Minimum Waiting Time + * \param[out] maxExtensions: Maximum Waiting Time Extensions + * \param[out] maxMessageSize: Maximum NDEF Message Size (in bytes) + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefGetRtdTnepServiceParameter(const ndefType* type, uint8_t* tnepVersion, ndefConstBuffer* bufServiceUri, uint8_t* comMode, uint8_t* minWaitingTime, uint8_t* maxExtensions, uint16_t* maxMessageSize); + + +/*! + ***************************************************************************** + * Convert an NDEF record to a TNEP Service Parameter RTD type + * + * \param[in] record: Record to convert + * \param[out] type: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordToRtdTnepServiceParameter(const ndefRecord* record, ndefType* type); + + +/*! + ***************************************************************************** + * Convert a TNEP Service Parameter RTD type to an NDEF record + * + * \param[in] type: Type to convert + * \param[out] record: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdTnepServiceParameterToRecord(const ndefType* type, ndefRecord* record); + + +/********************** + * TNEP Service Select + ********************** + */ + + +/*! + ***************************************************************************** + * Initialize a TNEP Service Select RTD type + * + * \param[out] type: Type to initialize + * \param[in] bufServiceUri: TNEP Service Name URI string buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdTnepServiceSelectInit(ndefType* type, const ndefConstBuffer* bufServiceUri); + + +/*! + ***************************************************************************** + * Get TNEP Service Select RTD type content + * + * \param[in] type: Type to get information from + * \param[out] bufServiceUri: TNEP Service Name URI string buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefGetRtdTnepServiceSelect(const ndefType* type, ndefConstBuffer* bufServiceUri); + + +/*! + ***************************************************************************** + * Convert an NDEF record to a TNEP Service Select RTD type + * + * \param[in] record: Record to convert + * \param[out] type: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordToRtdTnepServiceSelect(const ndefRecord* record, ndefType* type); + + +/*! + ***************************************************************************** + * Convert a TNEP Service Select RTD type to an NDEF record + * + * \param[in] type: Type to convert + * \param[out] record: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdTnepServiceSelectToRecord(const ndefType* type, ndefRecord* record); + + +/*************** + * TNEP Status + *************** + */ + + +/*! + ***************************************************************************** + * Initialize a TNEP Status RTD type + * + * \param[out] type: Type to initialize + * \param[in] statusType: TNEP status type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdTnepStatusInit(ndefType* type, uint8_t statusType); + + +/*! + ***************************************************************************** + * Get TNEP Status RTD type content + * + * \param[in] type: Type to get information from + * \param[out] statusType: TNEP status type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefGetRtdTnepStatus(const ndefType* type, uint8_t* statusType); + + +/*! + ***************************************************************************** + * Convert an NDEF record to a TNEP Status RTD type + * + * \param[in] record: Record to convert + * \param[out] type: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordToRtdTnepStatus(const ndefRecord* record, ndefType* type); + + +/*! + ***************************************************************************** + * Convert a TNEP Status RTD type to an NDEF record + * + * \param[in] type: Type to convert + * \param[out] record: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdTnepStatusToRecord(const ndefType* type, ndefRecord* record); + + +#endif /* NDEF_TYPES_TNEP_H */ + +/** + * @} + * + */ diff --git a/components/spi-st25r3911b/NDEF/include/message/ndef_type_uri.h b/components/spi-st25r3911b/NDEF/include/message/ndef_type_uri.h new file mode 100644 index 0000000..a261cad --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/message/ndef_type_uri.h @@ -0,0 +1,184 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF RTD (well-known and external) types header file + * + * NDEF RTD provides functionalities to handle RTD records, such as Text or URI. + * + * \addtogroup NDEF + * @{ + * + */ + +#ifndef NDEF_TYPE_URI_H +#define NDEF_TYPE_URI_H + + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_buffer.h" + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/*! RTD Type URI Protocols */ +#define NDEF_URI_PREFIX_NONE 0x00U /*!< No URI Protocol */ +#define NDEF_URI_PREFIX_HTTP_WWW 0x01U /*!< URI Protocol http://www. */ +#define NDEF_URI_PREFIX_HTTPS_WWW 0x02U /*!< URI Protocol https://www. */ +#define NDEF_URI_PREFIX_HTTP 0x03U /*!< URI Protocol http:// */ +#define NDEF_URI_PREFIX_HTTPS 0x04U /*!< URI Protocol https:// */ +#define NDEF_URI_PREFIX_TEL 0x05U /*!< URI Protocol tel: */ +#define NDEF_URI_PREFIX_MAILTO 0x06U /*!< URI Protocol mailto: */ +#define NDEF_URI_PREFIX_FTP_ANONYMOUS 0x07U /*!< URI Protocol ftp://anonymous@ */ +#define NDEF_URI_PREFIX_FTP_FTP 0x08U /*!< URI Protocol ftp://ftp. */ +#define NDEF_URI_PREFIX_FTPS 0x09U /*!< URI Protocol ftps:// */ +#define NDEF_URI_PREFIX_SFTP 0x0AU /*!< URI Protocol sftp:// */ +#define NDEF_URI_PREFIX_SMB 0x0BU /*!< URI Protocol smb:// */ +#define NDEF_URI_PREFIX_NFS 0x0CU /*!< URI Protocol nfs:// */ +#define NDEF_URI_PREFIX_FTP 0x0DU /*!< URI Protocol ftp:// */ +#define NDEF_URI_PREFIX_DAV 0x0EU /*!< URI Protocol dav:// */ +#define NDEF_URI_PREFIX_NEWS 0x0FU /*!< URI Protocol news: */ +#define NDEF_URI_PREFIX_TELNET 0x10U /*!< URI Protocol telnet:// */ +#define NDEF_URI_PREFIX_IMAP 0x11U /*!< URI Protocol imap: */ +#define NDEF_URI_PREFIX_RTSP 0x12U /*!< URI Protocol rtsp:// */ +#define NDEF_URI_PREFIX_URN 0x13U /*!< URI Protocol urn: */ +#define NDEF_URI_PREFIX_POP 0x14U /*!< URI Protocol pop: */ +#define NDEF_URI_PREFIX_SIP 0x15U /*!< URI Protocol sip: */ +#define NDEF_URI_PREFIX_SIPS 0x16U /*!< URI Protocol sips: */ +#define NDEF_URI_PREFIX_TFTP 0x17U /*!< URI Protocol tftp: */ +#define NDEF_URI_PREFIX_BTSPP 0x18U /*!< URI Protocol btspp:// */ +#define NDEF_URI_PREFIX_BTL2CAP 0x19U /*!< URI Protocol btl2cap:// */ +#define NDEF_URI_PREFIX_BTGOEP 0x1AU /*!< URI Protocol btgoep:// */ +#define NDEF_URI_PREFIX_TCPOBEX 0x1BU /*!< URI Protocol tcpobex:// */ +#define NDEF_URI_PREFIX_IRDAOBEX 0x1CU /*!< URI Protocol irdaobex:// */ +#define NDEF_URI_PREFIX_FILE 0x1DU /*!< URI Protocol file:// */ +#define NDEF_URI_PREFIX_URN_EPC_ID 0x1EU /*!< URI Protocol urn:epc:id: */ +#define NDEF_URI_PREFIX_URN_EPC_TAG 0x1FU /*!< URI Protocol urn:epc:tag */ +#define NDEF_URI_PREFIX_URN_EPC_PAT 0x20U /*!< URI Protocol urn:epc:pat: */ +#define NDEF_URI_PREFIX_URN_EPC_RAW 0x21U /*!< URI Protocol urn:epc:raw: */ +#define NDEF_URI_PREFIX_URN_EPC 0x22U /*!< URI Protocol urn:epc: */ +#define NDEF_URI_PREFIX_URN_NFC 0x23U /*!< URI Protocol urn:nfc: */ +#define NDEF_URI_PREFIX_AUTODETECT 0x24U /*!< ST Protocol Autodetect */ +#define NDEF_URI_PREFIX_COUNT 0x25U /*!< Number of URI protocols */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + +/*! RTD URI Record Type buffer */ +extern const ndefConstBuffer8 bufRtdTypeUri; /*! URI Record Type buffer */ + +/*! RTD Type URI */ +typedef struct +{ + uint8_t protocol; /*!< Protocol Idendifier */ + ndefConstBuffer bufUriString; /*!< URI string buffer */ +} ndefTypeRtdUri; + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/*************** + * URI + *************** + */ + +/*! + ***************************************************************************** + * Initialize a URI RTD type + * + * \param[out] uri: Type to initialize + * \param[in] protocol: URI protocol + * \param[in] bufUriString: URI string buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdUriInit(ndefType* uri, uint8_t protocol, const ndefConstBuffer* bufUriString); + + +/*! + ***************************************************************************** + * Get URI RTD type content + * + * \param[in] uri: Type to get information from + * \param[out] bufProtocol: URI protocol buffer + * \param[out] bufUriString: URI string buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefGetRtdUri(const ndefType* uri, ndefConstBuffer* bufProtocol, ndefConstBuffer* bufUriString); + + +/*! + ***************************************************************************** + * Convert an NDEF record to a URI RTD type + * + * \param[in] record: Record to convert + * \param[out] uri: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordToRtdUri(const ndefRecord* record, ndefType* uri); + + +/*! + ***************************************************************************** + * Convert a URI RTD type to an NDEF record + * + * \param[in] uri: Type to convert + * \param[out] record: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdUriToRecord(const ndefType* uri, ndefRecord* record); + + +#endif /* NDEF_TYPE_URI_H */ + +/** + * @} + * + */ diff --git a/components/spi-st25r3911b/NDEF/include/message/ndef_type_vcard.h b/components/spi-st25r3911b/NDEF/include/message/ndef_type_vcard.h new file mode 100644 index 0000000..5c352b1 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/message/ndef_type_vcard.h @@ -0,0 +1,216 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF MIME vCard type header file + * + * NDEF MIME type provides functionalities to handle vCard records. + * + * \addtogroup NDEF + * @{ + * + */ + +#ifndef NDEF_TYPE_VCARD_H +#define NDEF_TYPE_VCARD_H + + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_buffer.h" + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +#define NDEF_VCARD_PROPERTY_COUNT 16U /*!< Number of properties that can be decoded */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + +/*! vCard Record Type buffer */ +extern const ndefConstBuffer8 bufMediaTypeVCard; /*! vCard Record Type buffer */ + + +/*! NDEF Type vCard */ +typedef struct +{ + const uint8_t* propertyBuffer[NDEF_VCARD_PROPERTY_COUNT]; /*!< vCard property buffers */ + uint16_t propertyLength[NDEF_VCARD_PROPERTY_COUNT]; /*!< vCard property buffers length */ +} ndefTypeVCard; + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/*! + ***************************************************************************** + * Compare two NDEF buffers + * + * \param[in] buf1: reference buffer + * \param[in] buf2: buffer to compare to the reference buffer + * + * \return true if both buffers content and length match + ***************************************************************************** + */ +bool ndefBufferMatch(const ndefConstBuffer* buf1, const ndefConstBuffer* buf2); + + +/*************** + * vCard + *************** + */ + + +/*! + ***************************************************************************** + * Parse a vCard property to get the type, subtype if any, and its value + * + * \param[in] bufProperty: vCard Property to parse + * \param[out] bufType: property type + * \param[out] bufSubtype: property subtype + * \param[out] bufValue: property value + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefVCardParseProperty(const ndefConstBuffer* bufProperty, ndefConstBuffer* bufType, ndefConstBuffer* bufSubtype, ndefConstBuffer* bufValue); + + +/*! + ***************************************************************************** + * Add a property to the vCard type + * + * \param[in] vCard: vCard type + * \param[in] bufProperty: vCard Property to add, contain the type, subtype if any and its value + * + * \return ERR_NONE if successful, ERR_NOMEM or a standard error code + ***************************************************************************** + */ +ndefStatus ndefVCardSetProperty(ndefTypeVCard* vCard, const ndefConstBuffer* bufProperty); + + +/*! + ***************************************************************************** + * Get a pointer to a vCard property + * + * \param[in] vCard: vCard type + * \param[in] bufType: Type to find + * \param[out] bufProperty: The vCard property matching bufType: contain the type, subtype if any and the property value + * + * \return ERR_NONE if successful, ERR_NOTFOUND or a standard error code + ***************************************************************************** + */ +ndefStatus ndefVCardGetProperty(const ndefTypeVCard* vCard, const ndefConstBuffer* bufType, ndefConstBuffer* bufProperty); + + +/*! + ***************************************************************************** + * Reset a vCard type + * + * \param[in] vCard: vCard type + * + * This function resets each field of the ndefTypeVCard structure + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefVCardReset(ndefTypeVCard* vCard); + + +/*! + ***************************************************************************** + * Initialize a vCard + * + * \param[out] type: Type to initialize + * \param[in] vCard: vCard type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefVCardInit(ndefType* type, const ndefTypeVCard* vCard); + + +/*! + ***************************************************************************** + * Get vCard content + * + * \param[in] type: vCard type to get information from + * \param[out] vCard: vCard type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefGetVCard(const ndefType* type, ndefTypeVCard* vCard); + + +/*! + ***************************************************************************** + * Convert an NDEF record to a vCard + * + * \param[in] record: Record to convert + * \param[out] type: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordToVCard(const ndefRecord* record, ndefType* type); + + +/*! + ***************************************************************************** + * Convert a vCard type to an NDEF record + * + * \param[in] type: Type to convert + * \param[out] record: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefVCardToRecord(const ndefType* type, ndefRecord* record); + + +#endif /* NDEF_TYPE_VCARD_H */ + +/** + * @} + * + */ diff --git a/components/spi-st25r3911b/NDEF/include/message/ndef_type_wifi.h b/components/spi-st25r3911b/NDEF/include/message/ndef_type_wifi.h new file mode 100644 index 0000000..2025b14 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/message/ndef_type_wifi.h @@ -0,0 +1,155 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF Wifi type header file + * + * NDEF Wifi type provides functionalities to handle Wifi records. + * + * \addtogroup NDEF + * @{ + * + */ + +#ifndef NDEF_TYPE_WIFI_H +#define NDEF_TYPE_WIFI_H + + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_buffer.h" + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +#define NDEF_WIFI_AUTHENTICATION_NONE 0U /*!< WPS No Authentication (Should be 1, but set to 0 for Android native support) */ +#define NDEF_WIFI_AUTHENTICATION_WPAPSK 2U /*!< WPS Authentication based on WPAPSK */ +#define NDEF_WIFI_AUTHENTICATION_SHARED 3U /*!< WPS Authentication */ +#define NDEF_WIFI_AUTHENTICATION_WPA 4U /*!< WPS Authentication based on WPA */ +#define NDEF_WIFI_AUTHENTICATION_WPA2 5U /*!< WPS Authentication based on WPA2 */ +#define NDEF_WIFI_AUTHENTICATION_WPA2PSK 6U /*!< WPS Authentication based on WPA2PSK */ + + +#define NDEF_WIFI_ENCRYPTION_NONE 0U /*!< WPS No Encryption (Should be 1, but set to 0 for Android native support) */ +#define NDEF_WIFI_ENCRYPTION_WEP 2U /*!< WPS Encryption based on WEP */ +#define NDEF_WIFI_ENCRYPTION_TKIP 3U /*!< WPS Encryption based on TKIP */ +#define NDEF_WIFI_ENCRYPTION_AES 4U /*!< WPS Encryption based on AES */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + + +/*! Structure to store Network SSID, Authentication Type, Encryption Type and Network Key */ +typedef struct +{ + ndefConstBuffer bufNetworkSSID; /*!< Network SSID */ + ndefConstBuffer bufNetworkKey; /*!< Network Key */ + uint8_t authentication; /*!< Authentication type */ + uint8_t encryption; /*!< Encryption */ +} ndefTypeWifi; + + +/*! Wifi Record Type buffers */ +extern const ndefConstBuffer8 bufMediaTypeWifi; /*! Wifi Record Type buffer */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/*! + ***************************************************************************** + * Initialize a Wifi configuration + * + * \param[out] wifi: wifi type to initialize + * \param[in] wifiConfig: wifi configuration to use + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefWifiInit(ndefType* wifi, const ndefTypeWifi* wifiConfig); + + +/*! + ***************************************************************************** + * Get Wifi configuration + * + * \param[in] wifi: wifi type to get information from + * \param[out] wifiConfig: wifi configuration + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefGetWifi(const ndefType* wifi, ndefTypeWifi* wifiConfig); + + +/*! + ***************************************************************************** + * Convert an NDEF record to a wifi type + * + * \param[in] record: Record to convert + * \param[out] wifi: The converted wifi type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordToWifi(const ndefRecord* record, ndefType* wifi); + + +/*! + ***************************************************************************** + * Convert a wifi type to an NDEF record + * + * \param[in] wifi: wifi type to convert + * \param[out] record: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefWifiToRecord(const ndefType* wifi, ndefRecord* record); + + +#endif /* NDEF_TYPE_WIFI_H */ + +/** + * @} + * + */ diff --git a/components/spi-st25r3911b/NDEF/include/message/ndef_type_wlc.h b/components/spi-st25r3911b/NDEF/include/message/ndef_type_wlc.h new file mode 100644 index 0000000..db9de37 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/message/ndef_type_wlc.h @@ -0,0 +1,392 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2020 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF WLC (Wireless Charging) types header file + * + * NDEF WLC provides functionalities to handle WLC records, such + * WLC Capability, WLC Status Information, WLC Poll Information and WLC Listen Control. + * + * \addtogroup NDEF + * @{ + * + */ + +#ifndef NDEF_TYPE_WLC_H +#define NDEF_TYPE_WLC_H + + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_buffer.h" + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +#define NDEF_WLC_STATUSINFO_CONTROLBYTE1_BATTERY_LEVEL_MASK 0x01U /*!< WLC Status and Info Control byte 1: Battery Level mask */ +#define NDEF_WLC_STATUSINFO_CONTROLBYTE1_RECEIVE_POWER_MASK 0x02U /*!< WLC Status and Info Control byte 1: Receive Power mask */ +#define NDEF_WLC_STATUSINFO_CONTROLBYTE1_RECEIVE_VOLTAGE_MASK 0x04U /*!< WLC Status and Info Control byte 1: Receive Voltage mask */ +#define NDEF_WLC_STATUSINFO_CONTROLBYTE1_RECEIVE_CURRENT_MASK 0x08U /*!< WLC Status and Info Control byte 1: Receive Current mask */ +#define NDEF_WLC_STATUSINFO_CONTROLBYTE1_TEMPERATURE_BATTERY_MASK 0x10U /*!< WLC Status and Info Control byte 1: Temperature Battery mask */ +#define NDEF_WLC_STATUSINFO_CONTROLBYTE1_TEMPERATURE_WLCL_MASK 0x20U /*!< WLC Status and Info Control byte 1: Temperature WLCL mask */ +#define NDEF_WLC_STATUSINFO_CONTROLBYTE1_RFU_MASK 0x40U /*!< WLC Status and Info Control byte 1: RFU mask */ +#define NDEF_WLC_STATUSINFO_CONTROLBYTE1_CONTROL_BYTE_2_MASK 0x80U /*!< WLC Status and Info Control byte 1: Control byte 2 mask */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + + +/*! Structure to store WLC Capability */ +typedef struct +{ + uint8_t wlcProtocolVersion; /*!< WLC Protocol Version */ + uint8_t wlcConfigModeReq; /*!< WLC Config: MODE_REQ */ + uint8_t wlcConfigWaitTimeRetry; /*!< WLC Config: WaitTimeRetry */ + uint8_t wlcConfigNegoWait; /*!< WLC Config: NEGO_WAIT */ + uint8_t wlcConfigRdConf; /*!< WLC Config: RD_CONF */ + uint8_t capWtIntRfu; /*!< Cap Wt Int RFU */ + uint8_t capWtInt; /*!< Cap Wt Int */ + uint8_t ndefRdWt; /*!< NDEF Rd Wt */ + uint8_t ndefWriteToInt; /*!< NDEF Write To Int */ + uint8_t ndefWriteWtInt; /*!< NDEF Write Wt Int */ +} ndefTypeRtdWlcCapability; + + +/*! Structure to store WLC Status and Info */ +typedef struct +{ + uint8_t controlByte1; /*!< Control byte 1 */ + uint8_t batteryLevel; /*!< Battery level */ + uint8_t receivePower; /*!< Receive power */ + uint8_t receiveVoltage; /*!< Receive voltage */ + uint8_t receiveCurrent; /*!< Receive current */ + uint8_t temperatureBattery; /*!< Battery temperature */ + uint8_t temperatureWlcl; /*!< WLCL temperature */ + uint8_t rfu; /*!< RFU */ + uint8_t controlByte2; /*!< Control byte 2 */ +} ndefTypeRtdWlcStatusInfo; + + +/*! Structure to store WLC Poll Information */ +typedef struct +{ + uint8_t pTx; /*!< P Tx, Transmit Power Level */ + uint8_t wlcPCap; /*!< WLC_P Capability */ + uint8_t powerClass; /*!< Power Class */ + uint8_t totPowerSteps; /*!< Tot Power Steps */ + uint8_t curPowerStep; /*!< Current Power Step */ + uint8_t nextMinStepInc; /*!< Next Min Step Inc */ + uint8_t nextMinStepDec; /*!< Next Min Step Dec */ +} ndefTypeRtdWlcPollInfo; + + +/*! Structure to store WLC Listen Control */ +typedef struct +{ + uint8_t statusInfoErrorFlag; /*!< Status information: ERROR_FLG */ + uint8_t statusInfoBatteryStatus; /*!< Status information: BATTERY_STATUS */ + uint8_t statusInfoCnt; /*!< Status information: CNT */ + uint8_t wptConfigWptReq; /*!< WPT Config: WPT_REQ */ + uint8_t wptConfigWptDuration; /*!< WPT Config: WPT_DURATION */ + uint8_t wptConfigInfoReq; /*!< WPT Config: INFO_REQ */ + uint8_t powerAdjReq; /*!< Power Adjust Req */ + uint8_t batteryLevel; /*!< Battery level */ + uint8_t drvInfoFlag; /*!< Drv info: DRV_FLAG */ + uint8_t drvInfoInt; /*!< Drv info: DRV_INT */ + uint8_t holdOffWtInt; /*!< Hold off Wt Int */ + uint8_t errorInfoError; /*!< [Error info]* if ERROR_FLG set: WLC_INFO_ERROR */ + uint8_t errorInfoTemperature; /*!< [Error info]* if ERROR_FLG set: TEMPERATURE_ERROR */ +} ndefTypeRtdWlcListenCtl; + + +/*! WLC Record Type buffers */ +extern const ndefConstBuffer8 bufTypeRtdWlcCapability; /*!< WLC Capability Type Record buffer */ +extern const ndefConstBuffer8 bufTypeRtdWlcStatusInfo; /*!< WLC Status and Information Type Record buffer */ +extern const ndefConstBuffer8 bufTypeRtdWlcPollInfo; /*!< WLC Poll Information Type Record buffer */ +extern const ndefConstBuffer8 bufTypeRtdWlcListenCtl; /*!< WLC Listen Control Type Record buffer */ + + +/*! WLC MODE_REQ */ +typedef enum +{ + NDEF_RTD_WLC_CAPABILITY_MODE_STATIC, + NDEF_RTD_WLC_CAPABILITY_MODE_NEGOTIATED, + NDEF_RTD_WLC_CAPABILITY_MODE_BATTERY_FULL, + NDEF_RTD_WLC_CAPABILITY_MODE_RFU +} ndefRtdWlcReqMode; + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/*************************** + * WLC - Wireless Charging + *************************** + */ + + +/* WLC Capability */ + + +/*! + ***************************************************************************** + * Initialize a WLC Capability type + * + * \param[out] type: NDEF type to initialize + * \param[in] wlcCapability: WLC Capability + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdWlcCapabilityInit(ndefType* type, const ndefTypeRtdWlcCapability* wlcCapability); + + +/*! + ***************************************************************************** + * Get WLC Capability type content + * + * \param[in] type: NDEF type to get information from + * \param[out] wlcCapability: WLC Capability + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefGetRtdWlcCapability(const ndefType* type, ndefTypeRtdWlcCapability* wlcCapability); + + +/*! + ***************************************************************************** + * Convert an NDEF record to a WLC Capability type + * + * \param[in] record: Record to convert + * \param[out] type: The converted NDEF type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordToRtdWlcCapability(const ndefRecord* record, ndefType* type); + + +/*! + ***************************************************************************** + * Convert a WLC Capability type to an NDEF record + * + * \param[in] type: NDEF type to convert + * \param[out] record: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdWlcCapabilityToRecord(const ndefType* type, ndefRecord* record); + + +/* WLC Status and Information */ + + +/*! + ***************************************************************************** + * Initialize a WLC Status and Information type + * + * \param[out] type: NDEF type to initialize + * \param[in] wlcStatusInfo: WLC Status and Information + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdWlcStatusInfoInit(ndefType* type, const ndefTypeRtdWlcStatusInfo* wlcStatusInfo); + + +/*! + ***************************************************************************** + * Get WLC Status and Information type content + * + * \param[in] type: NDEF type to get information from + * \param[out] wlcStatusInfo: WLC Status and Information + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefGetRtdWlcStatusInfo(const ndefType* type, ndefTypeRtdWlcStatusInfo* wlcStatusInfo); + + +/*! + ***************************************************************************** + * Convert an NDEF record to a WLC Status and Information type + * + * \param[in] record: Record to convert + * \param[out] type: The converted NDEF type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordToRtdWlcStatusInfo(const ndefRecord* record, ndefType* type); + + +/*! + ***************************************************************************** + * Convert a WLC Status and Information type to an NDEF record + * + * \param[in] type: NDEF type to convert + * \param[out] record: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdWlcStatusInfoToRecord(const ndefType* type, ndefRecord* record); + + +/* WLC Poll Information */ + + +/*! + ***************************************************************************** + * Initialize a WLC Poll Information type + * + * \param[out] type: NDEF type to initialize + * \param[in] wlcPollInfo: WLC Poll Info + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdWlcPollInfoInit(ndefType* type, const ndefTypeRtdWlcPollInfo* wlcPollInfo); + + +/*! + ***************************************************************************** + * Get WLC Poll type content + * + * \param[in] type: NDEF type to get information from + * \param[out] wlcPollInfo: WLC Poll Info + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefGetRtdWlcPollInfo(const ndefType* type, ndefTypeRtdWlcPollInfo* wlcPollInfo); + + +/*! + ***************************************************************************** + * Convert an NDEF record to a WLC Poll Info type + * + * \param[in] record: Record to convert + * \param[out] type: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordToRtdWlcPollInfo(const ndefRecord* record, ndefType* type); + + +/*! + ***************************************************************************** + * Convert a WLC Poll Info type to an NDEF record + * + * \param[in] type: NDEF Type to convert + * \param[out] record: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdWlcPollInfoToRecord(const ndefType* type, ndefRecord* record); + + +/* WLC Listen Control */ + + +/*! + ***************************************************************************** + * Initialize a WLC Listen Control type + * + * \param[out] type: NDEF Type to initialize + * \param[in] wlcListenCtl: WLC Listen Control + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdWlcListenCtlInit(ndefType* type, const ndefTypeRtdWlcListenCtl* wlcListenCtl); + + +/*! + ***************************************************************************** + * Get WLC Listen Control type content + * + * \param[in] type: NDEF type to get information from + * \param[out] wlcListenCtl: WLC Listen Control + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefGetRtdWlcListenCtl(const ndefType* type, ndefTypeRtdWlcListenCtl* wlcListenCtl); + + +/*! + ***************************************************************************** + * Convert an NDEF record to a WLC Listen Control type + * + * \param[in] record: Record to convert + * \param[out] type: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordToRtdWlcListenCtl(const ndefRecord* record, ndefType* type); + + +/*! + ***************************************************************************** + * Convert a WLC Listen Control type to an NDEF record + * + * \param[in] type: NDEF type to convert + * \param[out] record: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdWlcListenCtlToRecord(const ndefType* type, ndefRecord* record); + + +#endif + +/** + * @} + * + */ diff --git a/components/spi-st25r3911b/NDEF/include/message/ndef_type_wpcwlc.h b/components/spi-st25r3911b/NDEF/include/message/ndef_type_wpcwlc.h new file mode 100644 index 0000000..22367dc --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/message/ndef_type_wpcwlc.h @@ -0,0 +1,163 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF RTD Wireless Power Consortium WLC Record (WPCWLC) type header file + * + * NDEF RTD provides functionalities to handle RTD WPCWLC records. + * + * \addtogroup NDEF + * @{ + * + */ + +#ifndef NDEF_TYPE_WPCWLC_H +#define NDEF_TYPE_WPCWLC_H + + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_buffer.h" + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + +#define NDEF_KI_APPLICATION_PROFILE 03U /*!< Ki Application Profile */ + +#define NDEF_KI_V10_PAYLOAD_LENGTH 16U /*!< Ki v1.0 Payload length */ + +#define NDEF_KI_APPLICATION_PROFILE_OFFSET 0x00U /*!< Ki Application Profile offset */ +#define NDEF_KI_VERSION_OFFSET 0x01U /*!< Ki Major|Minor Version Offset */ +#define NDEF_KI_ALIVE_FDT_OFFSET 0x02U /*!< Ki Alive FDT Offset */ +#define NDEF_KI_READ_ADDRESS_OFFSET 0x03U /*!< Ki Read Data Buffer Start Address Offset */ +#define NDEF_KI_WRITE_ADDRESS_OFFSET 0x04U /*!< Ki Write Data Buffer Start Address Offset */ +#define NDEF_KI_READ_SIZE_OFFSET 0x05U /*!< Ki Read Data Buffer Size Offset */ +#define NDEF_KI_WRITE_SIZE_OFFSET 0x06U /*!< Ki Write Data Buffer Size Offset */ +#define NDEF_KI_READ_CMD_OFFSET 0x07U /*!< Ki Read Command Code Offset */ +#define NDEF_KI_WRITE_CMD_OFFSET 0x08U /*!< Ki Write Commande Code Offset */ +#define NDEF_KI_MAX_T_SLOT_FOD_OFFSET 0x09U /*!< Ki Maximum T_SLOT FOD Offset */ +#define NDEF_KI_MIN_T_POWER_OFFSET 0x0AU /*!< Ki Minimum T_POWER Offset */ +#define NDEF_KI_T_SUSPEND_OFFSET 0x0BU /*!< Ki T_SUSPEND Offset */ +#define NDEF_KI_COMM_LAG_MAX_OFFSET 0x0CU /*!< Ki T_COMM_LAG,MAX Offset */ +#define NDEF_KI_WRITE_SEQ_LENGTH_OFFSET 0x0DU /*!< Ki Write Sequence Length Offset */ +#define NDEF_KI_MIN_POWER_OFFSET 0x0EU /*!< Ki Minimum Power Offset */ +#define NDEF_KI_MAX_POWER_OFFSET 0x0FU /*!< Ki Maximum Power Offset */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + +/*! RTD Record Type buffers */ +extern const ndefConstBuffer8 bufRtdTypeWpcWlc; /*! WPCWLC (Wireless Power Consortium WLC) Record Type buffer */ + + +/*! RTD Wireless Power Consortium WLC Record External Type */ +typedef struct +{ + ndefConstBuffer bufPayload; /*!< WPCWLC payload */ +} ndefTypeRtdWpcWlc; + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/********************** + * WPCWLC External Type + ********************** + */ + +/*! + ***************************************************************************** + * Initialize an RTD Wireless Power Consortium WLC Record External type + * + * \param[out] wpcWlc: Type to initialize + * \param[in] bufPayload: Payload buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdWpcWlcInit(ndefType* wpcWlc, const ndefConstBuffer* bufPayload); + + +/*! + ***************************************************************************** + * Get RTD Wireless Power Consortium WLC Record type content + * + * \param[in] wpcWlc: Type to get information from + * \param[out] bufWpcWlc: WPCWLC payload buffer + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefGetRtdWpcWlc(const ndefType* wpcWlc, ndefConstBuffer* bufWpcWlc); + + +/*! + ***************************************************************************** + * Convert an NDEF record to an RTD Wireless Power Consortium WLC Record External type + * + * \param[in] record: Record to convert + * \param[out] wpcWlc: The converted WPCWLC type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordToRtdWpcWlc(const ndefRecord* record, ndefType* wpcWlc); + + +/*! + ***************************************************************************** + * Convert an RTD Wireless Power Consortium WLC Record External type to an NDEF record + * + * \param[in] wpcWlc: WPCWLC type to convert + * \param[out] record: The converted type + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRtdWpcWlcToRecord(const ndefType* wpcWlc, ndefRecord* record); + + +#endif /* NDEF_TYPE_WPCWLC_H */ + +/** + * @} + * + */ diff --git a/components/spi-st25r3911b/NDEF/include/message/ndef_types.h b/components/spi-st25r3911b/NDEF/include/message/ndef_types.h new file mode 100644 index 0000000..c259fd9 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/message/ndef_types.h @@ -0,0 +1,259 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief Common NDEF RTD (well-known and external) and Media types header file + * + * NDEF types provides an abstraction layer gathering both the RTD and MIME types + * in a single generic ndefType interface. + * See ndefTypeStruct and ndefType + * + * \addtogroup NDEF + * @{ + * + */ + +#ifndef NDEF_TYPES_H +#define NDEF_TYPES_H + + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_config.h" +#include "ndef_record.h" +#include "ndef_buffer.h" + +/* RTD types */ +#if NDEF_TYPE_EMPTY_SUPPORT +#include "ndef_type_empty.h" +#endif +#if NDEF_TYPE_FLAT_SUPPORT +#include "ndef_type_flat.h" +#endif +#if NDEF_TYPE_RTD_DEVICE_INFO_SUPPORT +#include "ndef_type_deviceinfo.h" +#endif +#if NDEF_TYPE_RTD_TEXT_SUPPORT +#include "ndef_type_text.h" +#endif +#if NDEF_TYPE_RTD_URI_SUPPORT +#include "ndef_type_uri.h" +#endif +#if NDEF_TYPE_RTD_AAR_SUPPORT +#include "ndef_type_aar.h" +#endif +#if NDEF_TYPE_RTD_WLC_SUPPORT +#include "ndef_type_wlc.h" +#endif +#if NDEF_TYPE_RTD_WPCWLC_SUPPORT +#include "ndef_type_wpcwlc.h" +#endif +#if NDEF_TYPE_RTD_TNEP_SUPPORT +#include "ndef_type_tnep.h" +#endif + +/* MIME types */ +#if NDEF_TYPE_MEDIA_SUPPORT +#include "ndef_type_media.h" +#endif +#if NDEF_TYPE_BLUETOOTH_SUPPORT +#include "ndef_type_bluetooth.h" +#endif +#if NDEF_TYPE_VCARD_SUPPORT +#include "ndef_type_vcard.h" +#endif +#if NDEF_TYPE_WIFI_SUPPORT +#include "ndef_type_wifi.h" +#endif + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + + +/*****************************************************************************/ + +/*! NDEF Type Id enum */ +typedef enum +{ + NDEF_TYPE_ID_NONE = 0, + NDEF_TYPE_ID_FLAT, + NDEF_TYPE_ID_EMPTY, + NDEF_TYPE_ID_RTD_DEVICE_INFO, + NDEF_TYPE_ID_RTD_TEXT, + NDEF_TYPE_ID_RTD_URI, + NDEF_TYPE_ID_RTD_AAR, + NDEF_TYPE_ID_RTD_WLCCAP, + NDEF_TYPE_ID_RTD_WLCSTAI, + NDEF_TYPE_ID_RTD_WLCINFO, + NDEF_TYPE_ID_RTD_WLCCTL, + NDEF_TYPE_ID_RTD_WPCWLC, + NDEF_TYPE_ID_RTD_TNEP_SERVICE_PARAMETER, + NDEF_TYPE_ID_RTD_TNEP_SERVICE_SELECT, + NDEF_TYPE_ID_RTD_TNEP_STATUS, + NDEF_TYPE_ID_MEDIA, + NDEF_TYPE_ID_BLUETOOTH_BREDR, + NDEF_TYPE_ID_BLUETOOTH_LE, + NDEF_TYPE_ID_BLUETOOTH_SECURE_BREDR, + NDEF_TYPE_ID_BLUETOOTH_SECURE_LE, + NDEF_TYPE_ID_MEDIA_VCARD, + NDEF_TYPE_ID_MEDIA_WIFI, + NDEF_TYPE_ID_COUNT /* Keep this one last */ +} ndefTypeId; + + +/*! NDEF abstraction Struct */ +struct ndefTypeStruct +{ + ndefTypeId id; /*!< Type Id */ + uint32_t (*getPayloadLength)(const ndefType* type); /*!< Return payload length, specific to each type */ + const uint8_t* (*getPayloadItem)(const ndefType* type, ndefConstBuffer* item, bool begin); /*!< Payload Encoder, specific to each type */ + ndefStatus (*typeToRecord)(const ndefType* type, ndefRecord* record); /*!< Type to Record convert function */ + union + { +#if NDEF_TYPE_FLAT_SUPPORT + ndefConstBuffer bufPayload; /*!< Flat/unknown type */ +#endif +#if NDEF_TYPE_RTD_DEVICE_INFO_SUPPORT + ndefTypeRtdDeviceInfo deviceInfo; /*!< Device Information */ +#endif +#if NDEF_TYPE_RTD_TEXT_SUPPORT + ndefTypeRtdText text; /*!< Text */ +#endif +#if NDEF_TYPE_RTD_URI_SUPPORT + ndefTypeRtdUri uri; /*!< URI */ +#endif +#if NDEF_TYPE_RTD_AAR_SUPPORT + ndefTypeRtdAar aar; /*!< AAR */ +#endif +#if NDEF_TYPE_RTD_WLC_SUPPORT + ndefTypeRtdWlcCapability wlcCapability; /*!< WLC Capability */ + ndefTypeRtdWlcStatusInfo wlcStatusInfo; /*!< WLC Status and Info */ + ndefTypeRtdWlcPollInfo wlcPollInfo; /*!< WLC Poll Information */ + ndefTypeRtdWlcListenCtl wlcListenCtl; /*!< WLC Listen Control */ +#endif +#if NDEF_TYPE_RTD_WPCWLC_SUPPORT + ndefTypeRtdWpcWlc wpcWlc; /*!< WPC WLC */ +#endif +#if NDEF_TYPE_RTD_TNEP_SUPPORT + ndefTypeRtdTnepServiceParameter tnepServiceParameter; /*!< TNEP Service Parameter */ + ndefTypeRtdTnepServiceSelect tnepServiceSelect; /*!< TNEP Service Select */ + ndefTypeRtdTnepStatus tnepStatus; /*!< TNEP Status */ +#endif +#if NDEF_TYPE_MEDIA_SUPPORT + ndefTypeMedia media; /*!< Media */ +#endif +#if NDEF_TYPE_BLUETOOTH_SUPPORT + ndefTypeBluetooth bluetooth; /*!< Bluetooth */ +#endif +#if NDEF_TYPE_VCARD_SUPPORT + ndefTypeVCard vCard; /*!< vCard */ +#endif +#if NDEF_TYPE_WIFI_SUPPORT + ndefTypeWifi wifi; /*!< Wifi */ +#endif + uint8_t reserved; /*!< Non-conditional field to avoid empty union when all types are disabled */ + } data; /*!< Type data union */ +}; + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + + +/*! + ***************************************************************************** + * Convert a record to a supported type + * + * \param[in] record: Record to read + * \param[out] type: Type to store the converted record + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordToType(const ndefRecord* record, ndefType* type); + + +/*! + ***************************************************************************** + * Convert a supported type to a record + * + * \param[in] type: Pointer to the type to read data from + * \param[out] record: Record to fill + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefTypeToRecord(const ndefType* type, ndefRecord* record); + + +/*! + ***************************************************************************** + * Set the NDEF specific structure to process NDEF types + * + * \param[in] record: Record + * \param[out] type: NDEF type structure + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +ndefStatus ndefRecordSetNdefType(ndefRecord* record, const ndefType* type); + + +/*! + ***************************************************************************** + * Get the NDEF type structure of this record + * + * \param[in] record: Record + * + * \return ERR_NONE if successful or a standard error code + ***************************************************************************** + */ +const ndefType* ndefRecordGetNdefType(const ndefRecord* record); + + +#endif /* NDEF_TYPES_H */ + +/** + * @} + * + */ diff --git a/components/spi-st25r3911b/NDEF/include/ndef_config.h b/components/spi-st25r3911b/NDEF/include/ndef_config.h new file mode 100644 index 0000000..4b94274 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/ndef_config.h @@ -0,0 +1,168 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2020 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF config header file + * + * This file allows to select which NDEF features to use. + * + * \addtogroup NDEF + * @{ + * + */ + +#ifndef NDEF_CONFIG_H +#define NDEF_CONFIG_H + + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include +#include +#include "st_errno.h" + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + +#define ndefStatus stError /*!< NDEF error type */ + +/* + ****************************************************************************** + * NDEF FEATURES CONFIGURATION + ****************************************************************************** + */ + +#ifdef NDEF_CONFIG_CUSTOM + +#include "ndef_config_custom.h" + +/* Define default configuration when not set in ndef_config_custom.h */ +#ifndef ndefDevice +#include "rfal_nfc.h" +#include "rfal_t4t.h" +#define ndefDevice rfalNfcDevice /*!< NDEF Device */ +#endif +#ifndef NDEF_FEATURE_T1T +#define NDEF_FEATURE_T1T RFAL_FEATURE_T1T /*!< T1T Support control */ +#endif +#ifndef NDEF_FEATURE_T2T +#define NDEF_FEATURE_T2T RFAL_FEATURE_T2T /*!< T2T Support control */ +#endif +#ifndef NDEF_FEATURE_T3T +#define NDEF_FEATURE_T3T RFAL_FEATURE_NFCF /*!< T3T Support control */ +#endif +#ifndef NDEF_FEATURE_T4T +#define NDEF_FEATURE_T4T RFAL_FEATURE_T4T /*!< T4T Support control */ +#endif +#ifndef NDEF_FEATURE_T5T +#define NDEF_FEATURE_T5T RFAL_FEATURE_NFCV /*!< T5T Support control */ +#endif + + +#ifndef NDEF_FEATURE_FULL_API +#define NDEF_FEATURE_FULL_API false /*!< Support Write, Format, Check Presence, set Read-only in addition to the Read feature */ +#endif + +#ifndef NDEF_TYPE_EMPTY_SUPPORT +#define NDEF_TYPE_EMPTY_SUPPORT false /* NDEF library configuration missing. Disabled by default */ +#endif +#ifndef NDEF_TYPE_FLAT_SUPPORT +#define NDEF_TYPE_FLAT_SUPPORT false /* NDEF library configuration missing. Disabled by default */ +#endif +#ifndef NDEF_TYPE_RTD_AAR_SUPPORT +#define NDEF_TYPE_RTD_AAR_SUPPORT false /* NDEF library configuration missing. Disabled by default */ +#endif +#ifndef NDEF_TYPE_RTD_DEVICE_INFO_SUPPORT +#define NDEF_TYPE_RTD_DEVICE_INFO_SUPPORT false /* NDEF library configuration missing. Disabled by default */ +#endif +#ifndef NDEF_TYPE_RTD_URI_SUPPORT +#define NDEF_TYPE_RTD_URI_SUPPORT false /* NDEF library configuration missing. Disabled by default */ +#endif +#ifndef NDEF_TYPE_RTD_TEXT_SUPPORT +#define NDEF_TYPE_RTD_TEXT_SUPPORT false /* NDEF library configuration missing. Disabled by default */ +#endif +#ifndef NDEF_TYPE_RTD_WLC_SUPPORT +#define NDEF_TYPE_RTD_WLC_SUPPORT false /* NDEF library configuration missing. Disabled by default */ +#endif +#ifndef NDEF_TYPE_RTD_TNEP_SUPPORT +#define NDEF_TYPE_RTD_TNEP_SUPPORT false /* NDEF library configuration missing. Disabled by default */ +#endif +#ifndef NDEF_TYPE_MEDIA_SUPPORT +#define NDEF_TYPE_MEDIA_SUPPORT false /* NDEF library configuration missing. Disabled by default */ +#endif +#ifndef NDEF_TYPE_BLUETOOTH_SUPPORT +#define NDEF_TYPE_BLUETOOTH_SUPPORT false /* NDEF library configuration missing. Disabled by default */ +#endif +#ifndef NDEF_TYPE_VCARD_SUPPORT +#define NDEF_TYPE_VCARD_SUPPORT false /* NDEF library configuration missing. Disabled by default */ +#endif +#ifndef NDEF_TYPE_WIFI_SUPPORT +#define NDEF_TYPE_WIFI_SUPPORT false /* NDEF library configuration missing. Disabled by default */ +#endif + +#else /* NDEF_CONFIG_CUSTOM */ + +#include "rfal_nfc.h" +#include "rfal_t4t.h" + +#define ndefDevice rfalNfcDevice /*!< NDEF Device */ +#define NDEF_FEATURE_T1T RFAL_FEATURE_T1T /*!< T1T Support control */ +#define NDEF_FEATURE_T2T RFAL_FEATURE_T2T /*!< T2T Support control */ +#define NDEF_FEATURE_T3T RFAL_FEATURE_NFCF /*!< T3T Support control */ +#define NDEF_FEATURE_T4T RFAL_FEATURE_T4T /*!< T4T Support control */ +#define NDEF_FEATURE_T5T RFAL_FEATURE_NFCV /*!< T5T Support control */ + + +#define NDEF_FEATURE_FULL_API true /*!< Support Write, Format, Check Presence, set Read-only in addition to the Read feature */ + +#define NDEF_TYPE_EMPTY_SUPPORT true /*!< Support Empty type */ +#define NDEF_TYPE_FLAT_SUPPORT true /*!< Support Flat type */ +#define NDEF_TYPE_RTD_DEVICE_INFO_SUPPORT true /*!< Support RTD Device Information type */ +#define NDEF_TYPE_RTD_TEXT_SUPPORT true /*!< Support RTD Text type */ +#define NDEF_TYPE_RTD_URI_SUPPORT true /*!< Support RTD URI type */ +#define NDEF_TYPE_RTD_AAR_SUPPORT true /*!< Support RTD Android Application Record type */ +#define NDEF_TYPE_RTD_WLC_SUPPORT true /*!< Support RTD WLC Types */ +#define NDEF_TYPE_RTD_WPCWLC_SUPPORT true /*!< Support RTD WPC WLC type */ +#define NDEF_TYPE_RTD_TNEP_SUPPORT true /*!< Support RTD TNEP Types */ +#define NDEF_TYPE_MEDIA_SUPPORT true /*!< Support Media type */ +#define NDEF_TYPE_BLUETOOTH_SUPPORT true /*!< Support Bluetooth types */ +#define NDEF_TYPE_VCARD_SUPPORT true /*!< Support vCard type */ +#define NDEF_TYPE_WIFI_SUPPORT true /*!< Support Wifi type */ + +#endif /* NDEF_CONFIG_CUSTOM */ + +#endif /* NDEF_CONFIG_H */ + +/** + * @} + * + */ diff --git a/components/spi-st25r3911b/NDEF/include/poller/ndef_poller.h b/components/spi-st25r3911b/NDEF/include/poller/ndef_poller.h new file mode 100644 index 0000000..d0eded6 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/poller/ndef_poller.h @@ -0,0 +1,671 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief Provides NDEF methods and definitions to access NFC Forum Tags + * + * NDEF provides several functionalities required to perform NFC NDEF activities. + *
The NDEF encapsulates the different tag technologies (T2T, T3T, T4AT, T4BT, T5T) + * into a common and easy to use interface. + * + * It provides interfaces to Detect, Read, Write and Format NDEF. + * + * The most common interfaces are: + * + *
  ndefGetDeviceType() + *
  ndefPollerContextInitialization() + *
  ndefPollerNdefDetect() + *
  ndefPollerReadBytes() + *
  ndefPollerWriteBytes() + *
  ndefPollerReadRawMessage() + *
  ndefPollerWriteRawMessage() + *
  ndefPollerTagFormat() + *
  ndefPollerWriteMessage() + *
  ndefPollerCheckPresence() + *
  ndefPollerCheckAvailableSpace() + *
  ndefPollerSetReadOnly() + * + * + * An NDEF read usage example is provided here: \ref ndef_example_read.c + * \example ndef_example_read.c + * + * An NDEF write usage example is provided here: \ref ndef_example_write.c + * \example ndef_example_write.c + * + * \addtogroup NDEF + * @{ + * + */ + + +#ifndef NDEF_POLLER_H +#define NDEF_POLLER_H + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ +#include "ndef_message.h" + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + +#define NDEF_CC_BUF_LEN 17U /*!< CC buffer len. Max length = 17 in case of T4T v3 */ +#define NDEF_NFCV_SUPPORTED_CMD_LEN 4U /*!< Ext sys info supported commands list length */ +#define NDEF_NFCV_UID_LEN 8U /*!< NFC-V UID length */ + +#define NDEF_SHORT_VFIELD_MAX_LEN 254U /*!< Max V-field length for 1-byte Lengh encoding */ +#define NDEF_TERMINATOR_TLV_LEN 1U /*!< Terminator TLV size */ +#define NDEF_TERMINATOR_TLV_T 0xFEU /*!< Terminator TLV T=FEh */ + +#define NDEF_T2T_READ_RESP_SIZE 16U /*!< Size of the READ response i.e. four blocks */ +#define NDEF_T2T_MAX_RSVD_AREAS 3U /*!< Number of reserved areas including 1 Dyn Lock area */ + +#define NDEF_T3T_BLOCK_SIZE 16U /*!< size for a block in t3t */ +#define NDEF_T3T_MAX_NB_BLOCKS 4U /*!< size for a block in t3t */ +#define NDEF_T3T_BLOCK_NUM_MAX_SIZE 3U /*!< Maximun size for a block number */ +#define NDEF_T3T_MAX_RX_SIZE ((NDEF_T3T_BLOCK_SIZE*NDEF_T3T_MAX_NB_BLOCKS) + 13U) /*!< size for a CHECK Response 13 bytes (LEN+07h+NFCID2+Status+Nos) + (block size x Max Nob) */ +#define NDEF_T3T_MAX_TX_SIZE (((NDEF_T3T_BLOCK_SIZE + NDEF_T3T_BLOCK_NUM_MAX_SIZE) * NDEF_T3T_MAX_NB_BLOCKS) + 14U) \ + /*!< size for an UPDATE command, 11 bytes (LEN+08h+NFCID2+Nos) + 2 bytes for 1 SC + 1 byte for NoB + (block size + block num Len) x Max NoB */ + +#define NDEF_T5T_TxRx_BUFF_HEADER_SIZE 1U /*!< Request Flags/Responses Flags size */ +#define NDEF_T5T_TxRx_BUFF_FOOTER_SIZE 2U /*!< CRC size */ + +#define NDEF_T5T_TxRx_BUFF_SIZE \ + (32U + NDEF_T5T_TxRx_BUFF_HEADER_SIZE + NDEF_T5T_TxRx_BUFF_FOOTER_SIZE) /*!< T5T working buffer size */ + +/* + ****************************************************************************** + * GLOBAL MACROS + ****************************************************************************** + */ + +#define ndefBytes2Uint16(hiB, loB) ((uint16_t)((((uint32_t)(hiB)) << 8U) | ((uint32_t)(loB)))) /*!< convert 2 bytes to a u16 */ + +#define ndefMajorVersion(V) ((uint8_t)((V) >> 4U)) /*!< Get major version */ +#define ndefMinorVersion(V) ((uint8_t)((V) & 0xFU)) /*!< Get minor version */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + + +/*! NDEF device type */ +typedef enum { + NDEF_DEV_NONE = 0x00U, /*!< Device type undef */ + NDEF_DEV_T1T = 0x01U, /*!< Device type T1T */ + NDEF_DEV_T2T = 0x02U, /*!< Device type T2T */ + NDEF_DEV_T3T = 0x03U, /*!< Device type T3T */ + NDEF_DEV_T4T = 0x04U, /*!< Device type T4AT/T4BT */ + NDEF_DEV_T5T = 0x05U, /*!< Device type T5T */ +} ndefDeviceType; + +/*! NDEF states */ +typedef enum { + NDEF_STATE_INVALID = 0x00U, /*!< Invalid state (e.g. no CC) */ + NDEF_STATE_INITIALIZED = 0x01U, /*!< State Initialized (no NDEF message) */ + NDEF_STATE_READWRITE = 0x02U, /*!< Valid NDEF found. Read/Write capability */ + NDEF_STATE_READONLY = 0x03U, /*!< Valid NDEF found. Read only */ +} ndefState; + +/*! NDEF Information */ +typedef struct { + uint8_t majorVersion; /*!< Major version */ + uint8_t minorVersion; /*!< Minor version */ + uint32_t areaLen; /*!< Area Length for NDEF storage */ + uint32_t areaAvalableSpaceLen; /*!< Remaining Space in case a propTLV is present */ + uint32_t messageLen; /*!< NDEF message Length */ + ndefState state; /*!< Tag state e.g. NDEF_STATE_INITIALIZED */ +} ndefInfo; + +#if NDEF_FEATURE_T1T +/*! T1T Capability Container */ +typedef struct { + uint8_t magicNumber; /*!< Magic number e.g. E1h */ + uint8_t majorVersion; /*!< Major version i.e. 1 */ + uint8_t minorVersion; /*!< Minor version i.e. 2 */ + uint16_t tagMemorySize; /*!< Tag Memory Size (TMS) */ + uint8_t readAccess; /*!< NDEF READ access condition */ + uint8_t writeAccess; /*!< NDEF WRITE access condition */ +} ndefCapabilityContainerT1T; +#endif + +#if NDEF_FEATURE_T2T +/*! T2T Capability Container */ +typedef struct { + uint8_t magicNumber; /*!< Magic number e.g. E1h */ + uint8_t majorVersion; /*!< Major version i.e. 1 */ + uint8_t minorVersion; /*!< Minor version i.e. 2 */ + uint8_t size; /*!< Size. T2T_Area_Size = Size * 8 */ + uint8_t readAccess; /*!< NDEF READ access condition */ + uint8_t writeAccess; /*!< NDEF WRITE access condition */ +} ndefCapabilityContainerT2T; +#endif + +#if NDEF_FEATURE_T3T +/*! T3T Attribute info block */ +typedef struct { + uint8_t majorVersion; /*!< Major version i.e. 1 */ + uint8_t minorVersion; /*!< Minor version i.e. 2 */ + uint8_t nbR; /*!< Nbr: number of blocks read in one CHECK cmd */ + uint8_t nbW; /*!< Nbr: number of blocks written in one UPDATE cmd */ + uint16_t nMaxB; /*!< NmaxB: max number of blocks for NDEF data */ + uint8_t writeFlag; /*!< WriteFlag indicates completion of previous NDEF */ + uint8_t rwFlag; /*!< RWFlag indicates whether the NDEF can be updated */ + uint32_t Ln; /*!< Ln size of the actual stored NDEF data in bytes */ +} ndefAttribInfoBlockT3T; +#endif + +#if NDEF_FEATURE_T4T +/*! T4T Capability Container */ +typedef struct { + uint16_t ccLen; /*!< CCFILE Length */ + uint8_t vNo; /*!< Mapping version */ + uint16_t mLe; /*!< Max data size that can be read using a ReadBinary */ + uint16_t mLc; /*!< Max data size that can be sent using a single cmd */ + uint8_t fileId[2]; /*!< NDEF File Identifier */ + uint32_t fileSize; /*!< NDEF File Size */ + uint8_t readAccess; /*!< NDEF File READ access condition */ + uint8_t writeAccess; /*!< NDEF File WRITE access condition */ +} ndefCapabilityContainerT4T; +#endif + +#if NDEF_FEATURE_T5T +/*! T5T Capability Container */ +typedef struct { + uint8_t ccLen; /*!< CC Length */ + uint8_t magicNumber; /*!< Magic number i.e. E1h or E2h */ + uint8_t majorVersion; /*!< Major version i.e. 1 */ + uint8_t minorVersion; /*!< Minor version i.e. 0 */ + uint8_t readAccess; /*!< NDEF READ access condition */ + uint8_t writeAccess; /*!< NDEF WRITE access condition */ + uint16_t memoryLen; /*!< MLEN (Memory Len). T5T_Area size = 8 * MLEN (bytes)*/ + bool specialFrame; /*!< Use Special Frames for Write-alike commands */ + bool lockBlock; /*!< (EXTENDED_)LOCK_SINGLE_BLOCK supported */ + bool mlenOverflow; /*!< memory size exceeds 2040 bytes (Android) */ + bool multipleBlockRead; /*!< (EXTENDED_)READ_MULTIPLE_BLOCK supported */ +} ndefCapabilityContainerT5T; +#endif + +/*! Generic Capability Container */ +typedef union { +#if NDEF_FEATURE_T1T + ndefCapabilityContainerT1T t1t; /*!< T1T Capability Container */ +#endif +#if NDEF_FEATURE_T2T + ndefCapabilityContainerT2T t2t; /*!< T2T Capability Container */ +#endif +#if NDEF_FEATURE_T3T + ndefAttribInfoBlockT3T t3t; /*!< T3T Attribute Information Block */ +#endif +#if NDEF_FEATURE_T4T + ndefCapabilityContainerT4T t4t; /*!< T4T Capability Container */ +#endif +#if NDEF_FEATURE_T5T + ndefCapabilityContainerT5T t5t; /*!< T5T Capability Container */ +#endif +} ndefCapabilityContainer; + +#if NDEF_FEATURE_T1T +/*! NDEF T1T sub context structure */ +typedef struct { + void * rfu; /*!< RFU */ +} ndefT1TContext; +#endif + +#if NDEF_FEATURE_T2T +/*! NDEF T2T sub context structure */ +typedef struct { + uint8_t currentSecNo; /*!< Current sector number */ + uint8_t cacheBuf[NDEF_T2T_READ_RESP_SIZE]; /*!< Cache buffer */ + uint8_t nbrRsvdAreas; /*!< Number of reseved Areas */ + uint16_t dynLockNbrLockBits; /*!< Number of bits inside the DynLock_Area */ + uint16_t dynLockBytesLockedPerBit; /*!< Number of bytes locked by one Dynamic Lock bit */ + uint16_t dynLockNbrBytes; /*!< Number of bytes inside the DynLock_Area */ + uint16_t rsvdAreaSize[NDEF_T2T_MAX_RSVD_AREAS]; /*!< Sizes of reserved areas */ + uint32_t cacheAddr; /*!< Address of cached data */ + uint32_t offsetNdefTLV; /*!< NDEF TLV message offset */ + uint32_t dynLockFirstByteAddr; /*!< Address of the first byte of the DynLock_Area */ + uint32_t rsvdAreaFirstByteAddr[NDEF_T2T_MAX_RSVD_AREAS]; /*!< Addresses of reserved areas */ +} ndefT2TContext; +#endif + +#if NDEF_FEATURE_T3T +/*! NDEF T3T sub context structure */ +typedef struct { + uint8_t NFCID2[RFAL_NFCF_NFCID2_LEN]; /*!< NFCID2 */ + uint8_t txbuf[NDEF_T3T_MAX_TX_SIZE]; /*!< Tx buffer dedicated for T3T internal operations */ + uint8_t rxbuf[NDEF_T3T_MAX_RX_SIZE]; /*!< Rx buffer dedicated for T3T internal operations */ + rfalNfcfBlockListElem listBlocks[NDEF_T3T_MAX_NB_BLOCKS]; /*!< block number list for T3T internal operations */ +} ndefT3TContext; +#endif + +#if NDEF_FEATURE_T4T +/*! NDEF T4T sub context structure */ +typedef struct { + uint8_t curMLe; /*!< Current MLe. Default Fh until CC file is read */ + uint8_t curMLc; /*!< Current MLc. Default Dh until CC file is read */ + bool mv1Flag; /*!< Mapping version 1 flag */ + rfalIsoDepApduBufFormat cApduBuf; /*!< Command-APDU buffer */ + rfalIsoDepApduBufFormat rApduBuf; /*!< Response-APDU buffer */ + rfalT4tRApduParam respAPDU; /*!< Response-APDU params */ + rfalIsoDepBufFormat tmpBuf; /*!< I-Block temporary buffer */ + uint16_t rApduBodyLen; /*!< Response Body Length */ + uint32_t FWT; /*!< Frame Waiting Time (1/fc) */ + uint32_t dFWT; /*!< Delta Frame Waiting Time (1/fc) */ + uint16_t FSx; /*!< Frame Size Device/Card (FSD or FSC) */ + uint8_t DID; /*!< Device ID */ +} ndefT4TContext; +#endif + +#if NDEF_FEATURE_T5T +/*! NFCV (Extended) System Information */ +typedef struct { + uint16_t numberOfBlock; /*!< Number of block */ + uint8_t UID[NDEF_NFCV_UID_LEN]; /*!< UID Value */ + uint8_t supportedCmd[NDEF_NFCV_SUPPORTED_CMD_LEN];/*!< Supported Commands list */ + uint8_t infoFlags; /*!< Information flags */ + uint8_t DFSID; /*!< DFSID Value */ + uint8_t AFI; /*!< AFI Value */ + uint8_t blockSize; /*!< Block Size Value */ + uint8_t ICRef; /*!< IC Reference */ +} ndefSystemInformation; + +/*! NDEF T5T sub context structure */ +typedef struct { + const uint8_t* uid; /*!< UID in Addressed mode, NULL: Non-addr/Selected mode*/ + uint8_t flags; /*!< Command flags */ + uint32_t TlvNDEFOffset; /*!< NDEF TLV message offset */ + uint8_t blockLen; /*!< T5T BLEN parameter */ + ndefSystemInformation sysInfo; /*!< System Information (when supported) */ + bool sysInfoSupported; /*!< System Information Supported flag */ + bool legacySTHighDensity; /*!< Legacy ST High Density flag */ + uint8_t txrxBuf[NDEF_T5T_TxRx_BUFF_SIZE];/*!< Tx Rx Buffer */ + uint8_t cacheBuf[NDEF_T5T_TxRx_BUFF_SIZE];/*!< Cache buffer */ + uint32_t cacheBlock; /*!< Block number of cached buffer */ + bool useMultipleBlockRead; /*!< Access multiple block read */ + bool stDevice; /*!< ST device */ +} ndefT5TContext; +#endif + +/*! NDEF context structure */ +typedef struct { + ndefDeviceType type; /*!< NDEF Device type */ + ndefDevice device; /*!< NDEF Device */ + ndefState state; /*!< Tag state e.g. NDEF_STATE_INITIALIZED */ + ndefCapabilityContainer cc; /*!< Capability Container */ + uint32_t messageLen; /*!< NDEF message length */ + uint32_t messageOffset; /*!< NDEF message offset */ + uint32_t areaLen; /*!< Area Length for NDEF storage */ + uint8_t ccBuf[NDEF_CC_BUF_LEN]; /*!< buffer for CC */ + const struct ndefPollerWrapperStruct* + ndefPollWrapper; /*!< pointer to array of function for wrapper */ + union { +#if NDEF_FEATURE_T1T + ndefT1TContext t1t; /*!< T1T context */ +#endif +#if NDEF_FEATURE_T2T + ndefT2TContext t2t; /*!< T2T context */ +#endif +#if NDEF_FEATURE_T3T + ndefT3TContext t3t; /*!< T3T context */ +#endif +#if NDEF_FEATURE_T4T + ndefT4TContext t4t; /*!< T4T context */ +#endif +#if NDEF_FEATURE_T5T + ndefT5TContext t5t; /*!< T5T context */ +#endif + } subCtx; /*!< Sub-context union */ +} ndefContext; + +/*! Wrapper structure to hold the function pointers on each tag type */ +typedef struct ndefPollerWrapperStruct +{ + ndefStatus (* pollerContextInitialization)(ndefContext *ctx, const ndefDevice *dev); /*!< ContextInitialization function pointer */ + ndefStatus (* pollerNdefDetect)(ndefContext *ctx, ndefInfo *info); /*!< NdefDetect function pointer */ + ndefStatus (* pollerReadBytes)(ndefContext *ctx, uint32_t offset, uint32_t len, uint8_t *buf, uint32_t *rcvdLen); /*!< Read function pointer */ + ndefStatus (* pollerReadRawMessage)(ndefContext *ctx, uint8_t *buf, uint32_t bufLen, uint32_t *rcvdLen, bool single); /*!< ReadRawMessage function pointer */ +#if NDEF_FEATURE_FULL_API + ndefStatus (* pollerWriteBytes)(ndefContext *ctx, uint32_t offset, const uint8_t *buf, uint32_t len, bool pad, bool writeTerminator); /*!< Write function pointer */ + ndefStatus (* pollerWriteRawMessage)(ndefContext *ctx, const uint8_t *buf, uint32_t bufLen); /*!< WriteRawMessage function pointer */ + ndefStatus (* pollerTagFormat)(ndefContext *ctx, const ndefCapabilityContainer *cc, uint32_t options); /*!< TagFormat function pointer */ + ndefStatus (* pollerWriteRawMessageLen)(ndefContext *ctx, uint32_t rawMessageLen, bool writeTerminator); /*!< WriteRawMessageLen function pointer */ + ndefStatus (* pollerCheckPresence)(ndefContext *ctx); /*!< CheckPresence function pointer */ + ndefStatus (* pollerCheckAvailableSpace)(const ndefContext *ctx, uint32_t messageLen); /*!< CheckAvailableSpace function pointer */ + ndefStatus (* pollerBeginWriteMessage)(ndefContext *ctx, uint32_t messageLen); /*!< BeginWriteMessage function pointer */ + ndefStatus (* pollerEndWriteMessage)(ndefContext *ctx, uint32_t messageLen, bool writeTerminator); /*!< EndWriteMessage function pointer */ + ndefStatus (* pollerSetReadOnly)(ndefContext *ctx); /*!< SetReadOnly function pointer */ +#endif /* NDEF_FEATURE_FULL_API */ +} ndefPollerWrapper; + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/*! + ***************************************************************************** + * \brief Return the device type + * + * This funtion returns the device type from the context + * + * \param[in] dev: ndef Device + * + * \return the device type + ***************************************************************************** + */ +ndefDeviceType ndefGetDeviceType(const ndefDevice *dev); + + +/*! + ***************************************************************************** + * \brief Handle NDEF context activation + * + * This method performs the initialization of the NDEF context. + * It must be called after a successful + * anti-collision procedure and prior to any NDEF procedures such as NDEF + * detection procedure. + * + * \param[in] ctx : ndef Context + * \param[in] dev : ndef Device + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefPollerContextInitialization(ndefContext *ctx, const ndefDevice *dev); + + +/*! + ***************************************************************************** + * \brief NDEF Detection procedure + * + * This method performs the NDEF Detection procedure + * + * \param[in] ctx : ndef Context + * \param[out] info : ndef Information (optional parameter, NULL may be used when no NDEF Information is needed) + * + * \return ERR_WRONG_STATE : Library not initialized or mode not set + * \return ERR_REQUEST : Detection failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefPollerNdefDetect(ndefContext *ctx, ndefInfo *info); + + +/*! + ***************************************************************************** + * \brief Read data + * + * This method reads arbitrary length data + * + * \param[in] ctx : ndef Context + * \param[in] offset : file offset of where to start reading data + * \param[in] len : requested length + * \param[out] buf : buffer to place the data read from the tag + * \param[out] rcvdLen: received length + * + * \return ERR_WRONG_STATE : Library not initialized or mode not set + * \return ERR_REQUEST : read failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefPollerReadBytes(ndefContext *ctx, uint32_t offset, uint32_t len, uint8_t *buf, uint32_t *rcvdLen); + + +/*! + ***************************************************************************** + * \brief Write data + * + * This method writes arbitrary length data from the current selected file + * + * \param[in] ctx : ndef Context + * \param[in] offset : file offset of where to start writing data + * \param[in] buf : data to write + * \param[in] len : buf length + * + * \return ERR_WRONG_STATE : Library not initialized or mode not set + * \return ERR_REQUEST : read failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefPollerWriteBytes(ndefContext *ctx, uint32_t offset, const uint8_t *buf, uint32_t len); + + +/*! + ***************************************************************************** + * \brief Read raw NDEF message + * + * This method reads a raw NDEF message. + * Prior to NDEF Read procedure, a successful ndefPollerNdefDetect() + * has to be performed. + * + * + * \param[in] ctx : ndef Context + * \param[out] buf : buffer to place the NDEF message + * \param[in] bufLen : buffer length + * \param[out] rcvdLen: received length + * \param[in] single : performs the procedure as part of a single NDEF read operation. "true" can be used when migrating from previous version of this API as only SINGLE NDEF READ was supported. "false" can be used to force the reading of the NDEF length (e.g. for TNEP). + * + * \return ERR_WRONG_STATE : Library not initialized or mode not set + * \return ERR_REQUEST : read failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefPollerReadRawMessage(ndefContext *ctx, uint8_t *buf, uint32_t bufLen, uint32_t *rcvdLen, bool single); + + +/*! + ***************************************************************************** + * \brief Write raw NDEF message + * + * This method writes a raw NDEF message. + * Prior to NDEF Write procedure, a successful ndefPollerNdefDetect() + * has to be performed. + * + * \param[in] ctx : ndef Context + * \param[in] buf : raw message buffer + * \param[in] bufLen : buffer length + * + * \return ERR_WRONG_STATE : Library not initialized or mode not set + * \return ERR_REQUEST : write failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefPollerWriteRawMessage(ndefContext *ctx, const uint8_t *buf, uint32_t bufLen); + + +/*! + ***************************************************************************** + * \brief Format Tag + * + * This method formats a tag to make it ready for NDEF storage. + * cc and options parameters usage is described in each technology method + * (ndefT[2345]TPollerTagFormat) + * + * \param[in] ctx : ndef Context + * \param[in] cc : Capability Container + * \param[in] options : specific flags + * + * \return ERR_WRONG_STATE : Library not initialized or mode not set + * \return ERR_REQUEST : write failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefPollerTagFormat(ndefContext *ctx, const ndefCapabilityContainer *cc, uint32_t options); + + +/*! + ***************************************************************************** + * \brief Write NDEF message length + * + * This method writes the NLEN field + * + * \param[in] ctx : ndef Context + * \param[in] rawMessageLen: len + * + * \return ERR_WRONG_STATE : Library not initialized or mode not set + * \return ERR_REQUEST : write failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefPollerWriteRawMessageLen(ndefContext *ctx, uint32_t rawMessageLen); + + + /*! + ***************************************************************************** + * \brief Write an NDEF message + * + * Write the NDEF message to the tag + * + * \param[in] ctx: NDEF Context + * \param[in] message: Message to write + * + * \return ERR_WRONG_STATE : Library not initialized or mode not set + * \return ERR_REQUEST : write failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefPollerWriteMessage(ndefContext *ctx, const ndefMessage *message); + + +/*! + ***************************************************************************** + * \brief Check Presence + * + * This method checks whether an NFC tag is still present in the operating field + * + * \param[in] ctx : ndef Context + + * + * \return ERR_WRONG_STATE : Library not initialized or mode not set + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefPollerCheckPresence(ndefContext *ctx); + + +/*! + ***************************************************************************** + * \brief Check Available Space + * + * This method checks whether a NFC tag has enough space to write a message of a given length + * + * \param[in] ctx : ndef Context + * \param[in] messageLen: message length + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NOMEM : not enough space + * \return ERR_NONE : Enough space for message of messageLen length + ***************************************************************************** + */ +ndefStatus ndefPollerCheckAvailableSpace(const ndefContext *ctx, uint32_t messageLen); + + +/*! + ***************************************************************************** + * \brief Begin Write Message + * + * This method sets the L-field to 0 (T1T, T2T, T4T, T5T) or set the WriteFlag (T3T) and sets the message offset to the proper value according to messageLen + * + * \param[in] ctx : ndef Context + * \param[in] messageLen: message length + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NOMEM : not enough space + * \return ERR_NONE : Enough space for message of messageLen length + ***************************************************************************** + */ +ndefStatus ndefPollerBeginWriteMessage(ndefContext *ctx, uint32_t messageLen); + + +/*! + ***************************************************************************** + * \brief End Write Message + * + * This method updates the L-field value after the message has been written and resets the WriteFlag (for T3T only) + * + * \param[in] ctx : ndef Context + * \param[in] messageLen: message length + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NOMEM : not enough space + * \return ERR_NONE : Enough space for message of messageLen length + ***************************************************************************** + */ +ndefStatus ndefPollerEndWriteMessage(ndefContext *ctx, uint32_t messageLen); + + +/*! + ***************************************************************************** + * \brief Set Read Only + * + * This method performs the transition from the READ/WRITE state to the READ-ONLY state + * + * \param[in] ctx : ndef Context + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefPollerSetReadOnly(ndefContext *ctx); + + +#endif /* NDEF_POLLER_H */ + +/** + * @} + * + */ diff --git a/components/spi-st25r3911b/NDEF/include/poller/ndef_t2t.h b/components/spi-st25r3911b/NDEF/include/poller/ndef_t2t.h new file mode 100644 index 0000000..b209fcd --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/poller/ndef_t2t.h @@ -0,0 +1,351 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief Provides NDEF methods and definitions to access NFC Forum T2T + * + * NDEF T2T provides several functionalities required to + * perform NDEF message management with T2T tags. + * + * The most common interfaces are + *
  ndefT2TPollerContextInitialization() + *
  ndefT2TPollerNdefDetect() + *
  ndefT2TPollerReadRawMessage() + *
  ndefT2TPollerWriteRawMessage() + *
  ndefT2TPollerTagFormat() + * + * + * \addtogroup NDEF + * @{ + * + */ + + +#ifndef NDEF_T2T_H +#define NDEF_T2T_H + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ +#include "ndef_poller.h" + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL MACROS + ****************************************************************************** + */ + + /* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + +/*! + ***************************************************************************** + * \brief Handle T2T NDEF context activation + * + * This method performs the initialization of the NDEF context and handles + * the activation of the ISO-DEP layer. It must be called after a successful + * anti-collision procedure and prior to any NDEF procedures such as NDEF + * detection procedure. + * + * \param[in] ctx : ndef Context + * \param[in] dev : ndef Device + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT2TPollerContextInitialization(ndefContext *ctx, const ndefDevice *dev); + + +/*! + ***************************************************************************** + * \brief T2T NDEF Detection procedure + * + * This method performs the T2T NDEF Detection procedure + * + * + * \param[in] ctx : ndef Context + * \param[out] info : ndef Information (optional parameter, NULL may be used when no NDEF Information is needed) + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : Detection failed (application or ccfile not found) + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT2TPollerNdefDetect(ndefContext *ctx, ndefInfo *info); + + +/*! + ***************************************************************************** + * \brief T2T Read data from tag memory + * + * This method reads arbitrary length data from the current selected file + * + * \param[in] ctx : ndef Context + * \param[in] len : requested length + * \param[in] offset : file offset of where to start reading data + * \param[out] buf : buffer to place the data read from the tag + * \param[out] rcvdLen: received length + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : read failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT2TPollerReadBytes(ndefContext *ctx, uint32_t offset, uint32_t len, uint8_t *buf, uint32_t *rcvdLen); + + +/*! + ***************************************************************************** + * \brief T2T write data to tag memory + * + * This method reads arbitrary length data from the current selected file + * + * \param[in] ctx : ndef Context + * \param[in] offset : file offset of where to start writing data + * \param[in] buf : data to write + * \param[in] len : buf length + * \param[in] pad : pad remaining bytes of last modified block with 0s + * \param[in] writeTerminator: write Terminator TLV after data + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : read failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT2TPollerWriteBytes(ndefContext *ctx, uint32_t offset, const uint8_t *buf, uint32_t len, bool pad, bool writeTerminator); + + +/*! + ***************************************************************************** + * \brief T2T Read raw NDEF message + * + * This method reads a raw NDEF message from the current selected file. + * Prior to NDEF Read procedure, a successful ndefT2TPollerNdefDetect() + * has to be performed. + * + * \param[in] ctx : ndef Context + * \param[out] buf : buffer to place the NDEF message + * \param[in] bufLen : buffer length + * \param[out] rcvdLen: received length + * \param[in] single : performs the procedure as part of a single NDEF read operation + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : read failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT2TPollerReadRawMessage(ndefContext *ctx, uint8_t *buf, uint32_t bufLen, uint32_t *rcvdLen, bool single); + + +/*! + ***************************************************************************** + * \brief T2T Write raw NDEF message + * + * This method writes a raw NDEF message in the current selected file. + * Prior to NDEF Write procedure, a successful ndefT2TPollerNdefDetect() + * has to be performed. + * + * \warning Current selected file must not be changed between NDEF Detect + * procedure and NDEF Write procedure. If another file is selected before + * NDEF Write procedure, it is user responsibility to re-select NDEF file + * or to call ndefT2TPollerNdefDetect() to restore proper context. + * + * \param[in] ctx : ndef Context + * \param[in] buf : raw message buffer + * \param[in] bufLen : buffer length + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : write failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT2TPollerWriteRawMessage(ndefContext *ctx, const uint8_t *buf, uint32_t bufLen); + + +/*! + ***************************************************************************** + * \brief T2T Write NDEF message length + * + * This method writes the NLEN field (V2 mapping) or the ENLEN (V3 mapping). + * + * \param[in] ctx : ndef Context + * \param[in] rawMessageLen : len + * \param[in] writeTerminator: write Terminator TLV after data + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : write failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT2TPollerWriteRawMessageLen(ndefContext *ctx, uint32_t rawMessageLen, bool writeTerminator); + + +/*! + ***************************************************************************** + * \brief T2T Format Tag + * + * This method formats a tag to make it ready for NDEF storage. + * The Capability Container block is written only for virgin tags. + * If the cc parameter is not provided (i.e. NULL), a default one is used + * with T2T_AreaSize = 48 bytes. + * Beware that formatting is on most tags a one time operation (OTP bits!!!!) + * Doing a wrong format may render your tag unusable. + * options parameter is not used for T2T Tag Format method + * + * \param[in] ctx : ndef Context + * \param[in] cc : Capability Container + * \param[in] options: specific flags + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : write failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT2TPollerTagFormat(ndefContext *ctx, const ndefCapabilityContainer *cc, uint32_t options); + + +/*! + ***************************************************************************** + * \brief T2T Check Presence + * + * This method checks whether a T2T tag is still present in the operating field + * + * \param[in] ctx : ndef Context + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT2TPollerCheckPresence(ndefContext *ctx); + + +/*! + ***************************************************************************** + * \brief T2T Check Available Space + * + * This method checks whether a T2T tag has enough space to write a message of a given length + * + * \param[in] ctx : ndef Context + * \param[in] messageLen: message length + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NOMEM : not enough space + * \return ERR_NONE : Enough space for message of messageLen length + ***************************************************************************** + */ +ndefStatus ndefT2TPollerCheckAvailableSpace(const ndefContext *ctx, uint32_t messageLen); + + +/*! + ***************************************************************************** + * \brief T2T Begin Write Message + * + * This method sets the L-field to 0 and sets the message offset to the proper value according to messageLen + * + * \param[in] ctx : ndef Context + * \param[in] messageLen: message length + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NOMEM : not enough space + * \return ERR_NONE : Enough space for message of messageLen length + ***************************************************************************** + */ +ndefStatus ndefT2TPollerBeginWriteMessage(ndefContext *ctx, uint32_t messageLen); + + +/*! + ***************************************************************************** + * \brief T2T End Write Message + * + * This method updates the L-field value after the message has been written + * + * \param[in] ctx : ndef Context + * \param[in] messageLen : message length + * \param[in] writeTerminator: write Terminator TLV after data + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NOMEM : not enough space + * \return ERR_NONE : Enough space for message of messageLen length + ***************************************************************************** + */ +ndefStatus ndefT2TPollerEndWriteMessage(ndefContext *ctx, uint32_t messageLen, bool writeTerminator); + + +/*! + ***************************************************************************** + * \brief T2T Set Read Only + * + * This method perform the transition from the READ/WRITE state to the READ-ONLY state + * + * \param[in] ctx : ndef Context + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT2TPollerSetReadOnly(ndefContext *ctx); + + +#endif /* NDEF_T2T_H */ + +/** + * @} + */ diff --git a/components/spi-st25r3911b/NDEF/include/poller/ndef_t3t.h b/components/spi-st25r3911b/NDEF/include/poller/ndef_t3t.h new file mode 100644 index 0000000..7201a6b --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/poller/ndef_t3t.h @@ -0,0 +1,351 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief Provides NDEF methods and definitions to access NFC Forum T3T + * + * NDEF T3T provides several functionalities required to + * perform NDEF message management with T3T tags. + * + * The most common interfaces are + *
  ndefT3TPollerContextInitialization() + *
  ndefT3TPollerNdefDetect() + *
  ndefT3TPollerReadRawMessage() + *
  ndefT3TPollerWriteRawMessage() + *
  ndefT3TPollerTagFormat() + * + * + * \addtogroup NDEF + * @{ + * + */ + + +#ifndef NDEF_T3T_H +#define NDEF_T3T_H + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ +#include "ndef_poller.h" + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL MACROS + ****************************************************************************** + */ + + /* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + +/*! + ***************************************************************************** + * \brief Handle T3T NDEF context activation + * + * This method performs the initialization of the NDEF context and handles + * the activation of the ISO-DEP layer. It must be called after a successful + * anti-collision procedure and prior to any NDEF procedures such as NDEF + * detection procedure. + * + * \param[in] ctx : ndef Context + * \param[in] dev : ndef Device + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT3TPollerContextInitialization(ndefContext *ctx, const ndefDevice *dev); + + +/*! + ***************************************************************************** + * \brief T3T NDEF Detection procedure + * + * This method performs the T3T NDEF Detection procedure + * + * + * \param[in] ctx : ndef Context + * \param[out] info : ndef Information (optional parameter, NULL may be used when no NDEF Information is needed) + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : Detection failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT3TPollerNdefDetect(ndefContext *ctx, ndefInfo *info); + + +/*! + ***************************************************************************** + * \brief T3T Read data from file + * + * This method reads arbitrary length data from the current selected file + * + * \param[in] ctx : ndef Context + * \param[in] len : requested length + * \param[in] offset : file offset of where to start reading data + * \param[out] buf : buffer to place the data read from the tag + * \param[out] rcvdLen: received length + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : read failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT3TPollerReadBytes(ndefContext *ctx, uint32_t offset, uint32_t len, uint8_t *buf, uint32_t *rcvdLen); + + +/*! + ***************************************************************************** + * \brief T3T write data to file + * + * This method reads arbitrary length data from the current selected file + * + * \param[in] ctx : ndef Context + * \param[in] offset : file offset of where to start writing data + * \param[in] buf : data to write + * \param[in] len : buf length + * \param[in] pad : pad remaining bytes of last modified block with 0s + * \param[in] writeTerminator: write Terminator TLV after data + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : read failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT3TPollerWriteBytes(ndefContext *ctx, uint32_t offset, const uint8_t *buf, uint32_t len, bool pad, bool writeTerminator); + + +/*! + ***************************************************************************** + * \brief T3T Read raw NDEF message + * + * This method reads a raw NDEF message from the current selected file. + * Prior to NDEF Read procedure, a successful ndefT3TPollerNdefDetect() + * has to be performed. + * + * \param[in] ctx : ndef Context + * \param[out] buf : buffer to place the NDEF message + * \param[in] bufLen : buffer length + * \param[out] rcvdLen: received length + * \param[in] single : performs the procedure as part of a single NDEF read operation + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : read failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT3TPollerReadRawMessage(ndefContext *ctx, uint8_t *buf, uint32_t bufLen, uint32_t *rcvdLen, bool single); + + +/*! + ***************************************************************************** + * \brief T3T Write raw NDEF message + * + * This method writes a raw NDEF message in the current selected file. + * Prior to NDEF Write procedure, a successful ndefT3TPollerNdefDetect() + * has to be performed. + * + * \warning Current selected file must not be changed between NDEF Detect + * procedure and NDEF Write procedure. If another file is selected before + * NDEF Write procedure, it is user responsibility to re-select NDEF file + * or to call ndefT3TPollerNdefDetect() to restore proper context. + * + * \param[in] ctx : ndef Context + * \param[in] buf : raw message buffer + * \param[in] bufLen : buffer length + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : write failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT3TPollerWriteRawMessage(ndefContext *ctx, const uint8_t *buf, uint32_t bufLen); + + +/*! + ***************************************************************************** + * \brief T3T Write NDEF message length + * + * This method writes the NLEN field (V2 mapping) or the ENLEN (V3 mapping). + * + * \param[in] ctx : ndef Context + * \param[in] rawMessageLen : len + * \param[in] writeTerminator: unused + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : write failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT3TPollerWriteRawMessageLen(ndefContext *ctx, uint32_t rawMessageLen, bool writeTerminator); + + +/*! + ***************************************************************************** + * \brief T3T Format Tag + * + * This method formats a tag to make it ready for NDEF storage. + * cc parameter contains the Attribute Information Block fields + * If cc parameter is not provided (i.e. NULL), this method assumes + * that the AIB is already present. + * options parameter is not used for T3T Tag Format method + * + * + * \param[in] ctx : ndef Context + * \param[in] cc : Capability Container + * \param[in] options: specific flags + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : write failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT3TPollerTagFormat(ndefContext *ctx, const ndefCapabilityContainer *cc, uint32_t options); + + +/*! + ***************************************************************************** + * \brief T3T Check Presence + * + * This method checks whether a T3T tag is still present in the operating field + * + * \param[in] ctx : ndef Context + + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT3TPollerCheckPresence(ndefContext *ctx); + + +/*! + ***************************************************************************** + * \brief T3T Check Available Space + * + * This method checks whether a T3T tag has enough space to write a message of a given length + * + * \param[in] ctx : ndef Context + * \param[in] messageLen: message length + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NOMEM : not enough space + * \return ERR_NONE : Enough space for message of messageLen length + ***************************************************************************** + */ +ndefStatus ndefT3TPollerCheckAvailableSpace(const ndefContext *ctx, uint32_t messageLen); + + +/*! + ***************************************************************************** + * \brief T3T Begin Write Message + * + * This method sets the WriteFlag to the appropriate value before starting to write the NDEF message + * + * \param[in] ctx : ndef Context + * \param[in] messageLen: message length + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NOMEM : not enough space + * \return ERR_NONE : Enough space for message of messageLen length + ***************************************************************************** + */ +ndefStatus ndefT3TPollerBeginWriteMessage(ndefContext *ctx, uint32_t messageLen); + + +/*! + ***************************************************************************** + * \brief T3T End Write Message + * + * This method updates the Ln field of the AIB and resets the WriteFlag + * + * \param[in] ctx : ndef Context + * \param[in] messageLen : message length + * \param[in] writeTerminator: unused + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NOMEM : not enough space + * \return ERR_NONE : Enough space for message of messageLen length + ***************************************************************************** + */ +ndefStatus ndefT3TPollerEndWriteMessage(ndefContext *ctx, uint32_t messageLen, bool writeTerminator); + + +/*! + ***************************************************************************** + * \brief T3T Set Read Only + * + * This method perform the transition from the READ/WRITE state to the READ-ONLY state + * + * \param[in] ctx : ndef Context + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT3TPollerSetReadOnly(ndefContext *ctx); + + +#endif /* NDEF_T3T_H */ + +/** + * @} + */ diff --git a/components/spi-st25r3911b/NDEF/include/poller/ndef_t4t.h b/components/spi-st25r3911b/NDEF/include/poller/ndef_t4t.h new file mode 100644 index 0000000..2f70511 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/poller/ndef_t4t.h @@ -0,0 +1,501 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief Provides NDEF methods and definitions to access NFC Forum T4T + * + * NDEF T4T provides several functionalities required to + * perform NDEF message management with T4T tags. + * + * The most common interfaces are + *
  ndefT4TPollerContextInitialization() + *
  ndefT4TPollerNdefDetect() + *
  ndefT4TPollerReadRawMessage() + *
  ndefT4TPollerWriteRawMessage() + *
  ndefT4TPollerTagFormat() + * + * + * \addtogroup NDEF + * @{ + * + */ + + +#ifndef NDEF_T4T_H +#define NDEF_T4T_H + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ +#include "ndef_poller.h" + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + +#define NDEF_T4T_MAPPING_VERSION_2_0 0x20U /*!< Mapping version 2.0 */ +#define NDEF_T4T_MAPPING_VERSION_3_0 0x30U /*!< Mapping version 3.0 */ + +/*! Minimun size for an APDU (corresponding to Select NDEF App) */ +#define NDEF_T4T_MIN_APDU_LEN 13U + +/*! Maximun Response-APDU response body length (short field coding) */ +#if RFAL_FEATURE_ISO_DEP_APDU_MAX_LEN > (256 + RFAL_T4T_MAX_RAPDU_SW1SW2_LEN) +#define NDEF_T4T_MAX_RAPDU_BODY_LEN 256U +#else +#define NDEF_T4T_MAX_RAPDU_BODY_LEN (RFAL_FEATURE_ISO_DEP_APDU_MAX_LEN - RFAL_T4T_MAX_RAPDU_SW1SW2_LEN) +#endif + +/*! Maximun Command-APDU data length (short field coding) */ +#if RFAL_FEATURE_ISO_DEP_APDU_MAX_LEN > (255 + RFAL_T4T_MAX_CAPDU_PROLOGUE_LEN + RFAL_T4T_LC_LEN + RFAL_T4T_LE_LEN) +#define NDEF_T4T_MAX_CAPDU_BODY_LEN 255U +#else +#define NDEF_T4T_MAX_CAPDU_BODY_LEN (RFAL_FEATURE_ISO_DEP_APDU_MAX_LEN - (RFAL_T4T_MAX_CAPDU_PROLOGUE_LEN + RFAL_T4T_LC_LEN + RFAL_T4T_LE_LEN)) +#endif + + +/* + ****************************************************************************** + * GLOBAL MACROS + ****************************************************************************** + */ +#define ndefT4TIsReadAccessGranted(r) ( ((r) == 0x00U) || (((r) >= 0x80U) && ((r) <= 0xFEU)) ) /*!< Read access status */ +#define ndefT4TIsWriteAccessGranted(w) ( ((w) == 0x00U) || (((w) >= 0x80U) && ((w) <= 0xFEU)) ) /*!< Write access status */ + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + +/* +****************************************************************************** +* GLOBAL FUNCTION PROTOTYPES +****************************************************************************** +*/ + +/*! + ***************************************************************************** + * \brief Handle T4T NDEF context activation + * + * This method performs the initialization of the NDEF context and handles + * the activation of the ISO-DEP layer. It must be called after a successful + * anti-collision procedure and prior to any NDEF procedures such as NDEF + * detection procedure. + * + * \param[in] ctx : ndef Context + * \param[in] dev : ndef Device + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT4TPollerContextInitialization(ndefContext *ctx, const ndefDevice *dev); + + +/*! + ***************************************************************************** + * \brief T4T NDEF Detection procedure + * + * This method performs the T4T NDEF Detection procedure + * + * + * \param[in] ctx : ndef Context + * \param[out] info : ndef Information (optional parameter, NULL may be used when no NDEF Information is needed) + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : Detection failed (application or ccfile not found) + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT4TPollerNdefDetect(ndefContext *ctx, ndefInfo *info); + + +/*! + ***************************************************************************** + * \brief T4T Select NDEF Tag Application + * + * This method sends the Select NDEF tag application. If V2 Tag Application + * is not found, a Select NDEF tag V1 application is sent/ + * + * \param[in] ctx : ndef Context + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : Application not found + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT4TPollerSelectNdefTagApplication(ndefContext *ctx); + + +/*! + ***************************************************************************** + * \brief T4T Select File + * + * This method sends a Select File Command-APDU. + * + * The following fields of the ndef Context must be filled up before calling + * this method: + * - devType: device type + * - subCtx.t4t.mv1Flag: Mapping version 1 flag + * + * \param[in] ctx : ndef Context + * \param[in] fileId : file identifier + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : File not found + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT4TPollerSelectFile(ndefContext *ctx, const uint8_t *fileId); + + +/*! + ***************************************************************************** + * \brief T4T ReadBinary + * + * This method reads the data from the tag using a single + * ReadBinary command + * + * \param[in] ctx : ndef Context + * \param[in] offset : file offset of where to star reading data; valid range 0000h-7FFFh + * \param[in] len : requested length (short field coding) + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : read failed (SW1SW2 <> 9000h) + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT4TPollerReadBinary(ndefContext *ctx, uint16_t offset, uint8_t len); + + +/*! + ***************************************************************************** + * \brief T4T ReadBinary with ODO + * + * This method reads the data from the tag using a single + * ReadBinary ODO command + * + * \param[in] ctx : ndef Context + * \param[in] offset : file offset of where to star reading data; valid range 0000h-7FFFh + * \param[in] len : requested length (short field coding) + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : read failed (SW1SW2 <> 9000h) + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT4TPollerReadBinaryODO(ndefContext *ctx, uint32_t offset, uint8_t len); + + +/*! + ***************************************************************************** + * \brief T4T Read data from file + * + * This method reads arbitrary length data from the current selected file + * + * \param[in] ctx : ndef Context + * \param[in] len : requested length + * \param[in] offset : file offset of where to start reading data + * \param[out] buf : buffer to place the data read from the tag + * \param[out] rcvdLen: received length + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : read failed (SW1SW2 <> 9000h) + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT4TPollerReadBytes(ndefContext *ctx, uint32_t offset, uint32_t len, uint8_t *buf, uint32_t *rcvdLen); + +/*! + ***************************************************************************** + * \brief T4T WriteBinary + * + * This method writes the data to the tag using a single + * WriteBinary command + * + * \param[in] ctx : ndef Context + * \param[in] offset : file offset of where to star reading data; valid range 0000h-7FFFh + * \param[in] data : data to be written + * \param[in] len : data length + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : read failed (SW1SW2 <> 9000h) + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT4TPollerWriteBinary(ndefContext *ctx, uint16_t offset, const uint8_t *data, uint8_t len); + + +/*! + ***************************************************************************** + * \brief T4T WriteBinary with ODO + * + * This method writes the data to the tag using a single + * WriteBinary ODO command + * + * \param[in] ctx : ndef Context + * \param[in] offset : file offset of where to star reading data; valid range 0000h-7FFFh + * \param[in] data : data to be written + * \param[in] len : data length + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : read failed (SW1SW2 <> 9000h) + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT4TPollerWriteBinaryODO(ndefContext *ctx, uint32_t offset, const uint8_t *data, uint8_t len); + +/*! + ***************************************************************************** + * \brief T4T write data to file + * + * This method reads arbitrary length data from the current selected file + * + * \param[in] ctx : ndef Context + * \param[in] offset : file offset of where to start writing data + * \param[in] buf : data to write + * \param[in] len : buf length + * \param[in] pad : unused + * \param[in] writeTerminator: unused + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : read failed (SW1SW2 <> 9000h) + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT4TPollerWriteBytes(ndefContext *ctx, uint32_t offset, const uint8_t *buf, uint32_t len, bool pad, bool writeTerminator); + + +/*! + ***************************************************************************** + * \brief T4T Read raw NDEF message + * + * This method reads a raw NDEF message from the current selected file. + * Prior to NDEF Read procedure, a successfull ndefT4TPollerNdefDetect() + * has to be performed. + * + * \warning Current selected file must not be changed between NDEF Detect + * procedure and NDEF Read procedure. If another file is selected before + * NDEF Read procedure, it is user responsibility to re-select NDEF file + * or to call ndefT4TPollerNdefDetect() to restore proper context. + * + * \param[in] ctx : ndef Context + * \param[out] buf : buffer to place the NDEF message + * \param[in] bufLen : buffer length + * \param[out] rcvdLen: received length + * \param[in] single : performs the procedure as part of a single NDEF read operation + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : read failed (SW1SW2 <> 9000h) + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT4TPollerReadRawMessage(ndefContext *ctx, uint8_t *buf, uint32_t bufLen, uint32_t *rcvdLen, bool single); + + +/*! + ***************************************************************************** + * \brief T4T Write raw NDEF message + * + * This method writes a raw NDEF message in the current selected file. + * Prior to NDEF Write procedure, a successfull ndefT4TPollerNdefDetect() + * has to be performed. + * + * \warning Current selected file must not be changed between NDEF Detect + * procedure and NDEF Write procedure. If another file is selected before + * NDEF Write procedure, it is user responsibility to re-select NDEF file + * or to call ndefT4TPollerNdefDetect() to restore proper context. + * + * \param[in] ctx : ndef Context + * \param[in] buf : raw message buffer + * \param[in] bufLen : buffer length + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : write failed (SW1SW2 <> 9000h) + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT4TPollerWriteRawMessage(ndefContext *ctx, const uint8_t *buf, uint32_t bufLen); + + +/*! + ***************************************************************************** + * \brief T4T Write NDEF message length + * + * This method writes the NLEN field (V2 mapping) or the ENLEN (V3 mapping). + * + * \param[in] ctx : ndef Context + * \param[in] rawMessageLen : len + * \param[in] writeTerminator: unused + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : write failed (SW1SW2 <> 9000h) + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT4TPollerWriteRawMessageLen(ndefContext *ctx, uint32_t rawMessageLen, bool writeTerminator); + + +/*! + ***************************************************************************** + * \brief T4T Format Tag + * + * This method formats a tag to make it ready for NDEF storage. In case of T4T, + * it writes NLEN/ENLEN=0 to the NDEF File. + * cc and options parameters are not used for T4T Tag Format method. + * + * \param[in] ctx : ndef Context + * \param[in] cc : Capability Container + * \param[in] options: specific flags + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : write failed (SW1SW2 <> 9000h) + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT4TPollerTagFormat(ndefContext *ctx, const ndefCapabilityContainer *cc, uint32_t options); + + +/*! + ***************************************************************************** + * \brief T4T Check Presence + * + * This method checks whether a T4T tag is still present in the operating field + * + * \param[in] ctx : ndef Context + + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT4TPollerCheckPresence(ndefContext *ctx); + + +/*! + ***************************************************************************** + * \brief T4T Check Available Space + * + * This method checks whether a T4T tag has enough space to write a message of a given length + * + * \param[in] ctx : ndef Context + * \param[in] messageLen: message length + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NOMEM : not enough space + * \return ERR_NONE : Enough space for message of messageLen length + ***************************************************************************** + */ +ndefStatus ndefT4TPollerCheckAvailableSpace(const ndefContext *ctx, uint32_t messageLen); + + +/*! + ***************************************************************************** + * \brief T4T Begin Write Message + * + * This method sets the L-field to 0 + * + * \param[in] ctx : ndef Context + * \param[in] messageLen: message length + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NOMEM : not enough space + * \return ERR_NONE : Enough space for message of messageLen length + ***************************************************************************** + */ +ndefStatus ndefT4TPollerBeginWriteMessage(ndefContext *ctx, uint32_t messageLen); + + +/*! + ***************************************************************************** + * \brief T4T End Write Message + * + * This method updates the L-field value after the message has been written + * + * \param[in] ctx : ndef Context + * \param[in] messageLen : message length + * \param[in] writeTerminator: unused + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NOMEM : not enough space + * \return ERR_NONE : Enough space for message of messageLen length + ***************************************************************************** + */ +ndefStatus ndefT4TPollerEndWriteMessage(ndefContext *ctx, uint32_t messageLen, bool writeTerminator); + + +/*! + ***************************************************************************** + * \brief T4T Set Read Only + * + * This method perform the transition from the READ/WRITE state to the READ-ONLY state + * + * \param[in] ctx : ndef Context + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT4TPollerSetReadOnly(ndefContext *ctx); + + +#endif /* NDEF_T4T_H */ + +/** + * @} + */ diff --git a/components/spi-st25r3911b/NDEF/include/poller/ndef_t5t.h b/components/spi-st25r3911b/NDEF/include/poller/ndef_t5t.h new file mode 100644 index 0000000..4600375 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/poller/ndef_t5t.h @@ -0,0 +1,482 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief Provides NDEF methods and definitions to access NFC Forum T5T + * + * NDEF T5T provides several functionalities required to + * perform NDEF message management with T5T tags. + * + * The most common interfaces are: + * + *
  ndefT5TPollerContextInitialization() + *
  ndefT5TPollerNdefDetect() + *
  ndefT5TPollerReadBytes() + *
  ndefT5TPollerWriteBytes() + *
  ndefT5TPollerReadRawMessage() + *
  ndefT5TPollerWriteRawMessage() + *
  ndefT5TPollerTagFormat() + *
  ndefT5TPollerCheckPresence() + *
  ndefT5TPollerCheckAvailableSpace() + *
  ndefT5TPollerSetReadOnly() + * + * + * \addtogroup NDEF + * @{ + * + */ + + +#ifndef NDEF_T5T_H +#define NDEF_T5T_H + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ +#include "ndef_poller.h" + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + +#define NDEF_T5T_MAPPING_VERSION_1_0 (1U << 6) /*!< T5T Version 1.0 */ + +#define NDEF_SYSINFO_FLAG_DFSID_POS (0U) /*!< Info flags DFSID flag position */ +#define NDEF_SYSINFO_FLAG_AFI_POS (1U) /*!< Info flags AFI flag position */ +#define NDEF_SYSINFO_FLAG_MEMSIZE_POS (2U) /*!< Info flags Memory Size flag position */ +#define NDEF_SYSINFO_FLAG_ICREF_POS (3U) /*!< Info flags IC reference flag position */ +#define NDEF_SYSINFO_FLAG_MOI_POS (4U) /*!< Info flags MOI flag position */ +#define NDEF_SYSINFO_FLAG_CMDLIST_POS (5U) /*!< Info flags Command List flag position */ +#define NDEF_SYSINFO_FLAG_CSI_POS (6U) /*!< Info flags CSI flag position */ +#define NDEF_SYSINFO_FLAG_LEN_POS (7U) /*!< Info flags Length position */ + +#define NDEF_CMDLIST_READSINGLEBLOCK_POS (0U) /*!< Cmd List: ReadSingleBlock position */ +#define NDEF_CMDLIST_WRITESINGLEBLOCK_POS (1U) /*!< Cmd List: WriteSingleBlock position */ +#define NDEF_CMDLIST_LOCKSINGLEBLOCK_POS (2U) /*!< Cmd List: LockSingleBlock position */ +#define NDEF_CMDLIST_READMULTIPLEBLOCKS_POS (3U) /*!< Cmd List: ReadMultipleBlocks position */ +#define NDEF_CMDLIST_WRITEMULTIPLEBLOCKS_POS (4U) /*!< Cmd List: WriteMultipleBlocks position */ +#define NDEF_CMDLIST_SELECT_POS (5U) /*!< Cmd List: SelectSupported position */ +#define NDEF_CMDLIST_RESETTOREADY_POS (6U) /*!< Cmd List: ResetToReady position */ +#define NDEF_CMDLIST_GETMULTIPLEBLOCKSECSTATUS_POS (7U) /*!< Cmd List: GetMultipleBlockSecStatus position */ + +#define NDEF_CMDLIST_WRITEAFI_POS (0U) /*!< Cmd List: WriteAFI position */ +#define NDEF_CMDLIST_LOCKAFI_POS (1U) /*!< Cmd List: LockAFI position */ +#define NDEF_CMDLIST_WRITEDSFID_POS (2U) /*!< Cmd List: WriteDSFID position */ +#define NDEF_CMDLIST_LOCKDSFID_POS (3U) /*!< Cmd List: LockDSFID position */ +#define NDEF_CMDLIST_GETSYSTEMINFORMATION_POS (4U) /*!< Cmd List: GetSystemInformation position */ +#define NDEF_CMDLIST_CUSTOMCMDS_POS (5U) /*!< Cmd List: CustomCmds position */ +#define NDEF_CMDLIST_FASTREADMULTIPLEBLOCKS_POS (6U) /*!< Cmd List: FastReadMultipleBlocks position */ + +#define NDEF_CMDLIST_EXTREADSINGLEBLOCK_POS (0U) /*!< Cmd List: ExtReadSingleBlock position */ +#define NDEF_CMDLIST_EXTWRITESINGLEBLOCK_POS (1U) /*!< Cmd List: ExtWriteSingleBlock position */ +#define NDEF_CMDLIST_EXTLOCKSINGLEBLOCK_POS (2U) /*!< Cmd List: ExtLockSingleBlock position */ +#define NDEF_CMDLIST_EXTREADMULTIPLEBLOCKS_POS (3U) /*!< Cmd List: ExtReadMultipleBlocks position */ +#define NDEF_CMDLIST_EXTWRITEMULTIPLEBLOCKS_POS (4U) /*!< Cmd List: ExtWriteMultipleBlocks position */ +#define NDEF_CMDLIST_EXTGETMULTIPLEBLOCKSECSTATUS_POS (5U) /*!< Cmd List: ExtGetMultipleBlockSecStatus position */ +#define NDEF_CMDLIST_FASTEXTENDEDREADMULTIPLEBLOCKS_POS (6U) /*!< Cmd List: FastExtendedReadMultipleBlocks position */ + +#define NDEF_T5T_CC_MAGIC_1_BYTE_ADDR_MODE 0xE1U /*!< T5T CC Magic Number (1-byte Addres Mode) */ +#define NDEF_T5T_CC_MAGIC_2_BYTE_ADDR_MODE 0xE2U /*!< T5T CC Magic Number (2-byte Addres Mode) */ +#define NDEF_T5T_CC_LEN_4_BYTES 4U /*!< T5T CC Length (4 bytes) */ +#define NDEF_T5T_CC_LEN_8_BYTES 8U /*!< T5T CC Length (8 bytes) */ +#define NDEF_T5T_FORMAT_OPTION_NFC_FORUM 1U /*!< Format tag according to NFC Forum MLEN computation */ + +/* + ****************************************************************************** + * GLOBAL MACROS + ****************************************************************************** + */ +#define ndefT5TMajorVersion(V) ((uint8_t)( (V) >> 6U)) /*!< Get major version */ +#define ndefT5TMinorVersion(V) ((uint8_t)(((V) >> 4U) & 3U)) /*!< Get minor version */ + +#define ndefT5TSysInfoDFSIDPresent(infoFlags) (((infoFlags) >> NDEF_SYSINFO_FLAG_DFSID_POS) & 0x01U) /*!< Returns DFSID presence flag */ +#define ndefT5TSysInfoAFIPresent(infoFlags) (((infoFlags) >> NDEF_SYSINFO_FLAG_AFI_POS) & 0x01U) /*!< Returns AFI presence flag */ +#define ndefT5TSysInfoMemSizePresent(infoFlags) (((infoFlags) >> NDEF_SYSINFO_FLAG_MEMSIZE_POS) & 0x01U) /*!< Returns Memory size presence flag */ +#define ndefT5TSysInfoICRefPresent(infoFlags) (((infoFlags) >> NDEF_SYSINFO_FLAG_ICREF_POS) & 0x01U) /*!< Returns IC Reference presence flag */ +#define ndefT5TSysInfoMOIValue(infoFlags) (((infoFlags) >> NDEF_SYSINFO_FLAG_MOI_POS) & 0x01U) /*!< Returns MOI value */ +#define ndefT5TSysInfoCmdListPresent(infoFlags) (((infoFlags) >> NDEF_SYSINFO_FLAG_CMDLIST_POS) & 0x01U) /*!< Returns Command List presence flag */ +#define ndefT5TSysInfoCSIPresent(infoFlags) (((infoFlags) >> NDEF_SYSINFO_FLAG_CSI_POS) & 0x01U) /*!< Returns CSI presence flag */ +#define ndefT5TSysInfoLenValue(infoFlags) (((infoFlags) >> NDEF_SYSINFO_FLAG_LEN_POS) & 0x01U) /*!< Returns Info flag length value */ + +#define ndefT5TSysInfoReadSingleBlockSupported(cmdList) (((cmdList)[0] >> NDEF_CMDLIST_READSINGLEBLOCK_POS) & 0x01U) /*!< Returns ReadSingleBlock support flag */ +#define ndefT5TSysInfoWriteSingleBlockSupported(cmdList) (((cmdList)[0] >> NDEF_CMDLIST_WRITESINGLEBLOCK_POS) & 0x01U) /*!< Returns WriteSingleBlock support flag */ +#define ndefT5TSysInfoLockSingleBlockSupported(cmdList) (((cmdList)[0] >> NDEF_CMDLIST_LOCKSINGLEBLOCK_POS) & 0x01U) /*!< Returns LockSingleBlock support flag */ +#define ndefT5TSysInfoReadMultipleBlocksSupported(cmdList) (((cmdList)[0] >> NDEF_CMDLIST_READMULTIPLEBLOCKS_POS) & 0x01U) /*!< Returns ReadMultipleBlocks support flag */ +#define ndefT5TSysInfoWriteMultipleBlocksSupported(cmdList) (((cmdList)[0] >> NDEF_CMDLIST_WRITEMULTIPLEBLOCKS_POS) & 0x01U) /*!< Returns WriteMultipleBlocks support flag */ +#define ndefT5TSysInfoSelectSupported(cmdList) (((cmdList)[0] >> NDEF_CMDLIST_SELECT_POS) & 0x01U) /*!< Returns SelectSupported support flag */ +#define ndefT5TSysInfoResetToReadySupported(cmdList) (((cmdList)[0] >> NDEF_CMDLIST_RESETTOREADY_POS) & 0x01U) /*!< Returns ResetToReady support flag */ +#define ndefT5TSysInfoGetMultipleBlockSecStatusSupported(cmdList) (((cmdList)[0] >> NDEF_CMDLIST_GETMULTIPLEBLOCKSECSTATUS_POS) & 0x01U) /*!< Returns GetMultipleBlockSecStatus support flag */ + +#define ndefT5TSysInfoWriteAFISupported(cmdList) (((cmdList)[1] >> NDEF_CMDLIST_WRITEAFI_POS) & 0x01U) /*!< Returns WriteAFI support flag */ +#define ndefT5TSysInfoLockAFISupported(cmdList) (((cmdList)[1] >> NDEF_CMDLIST_LOCKAFI_POS) & 0x01U) /*!< Returns LockAFI support flag */ +#define ndefT5TSysInfoWriteDSFIDSupported(cmdList) (((cmdList)[1] >> NDEF_CMDLIST_WRITEDSFID_POS) & 0x01U) /*!< Returns WriteDSFID support flag */ +#define ndefT5TSysInfoLockDSFIDSupported(cmdList) (((cmdList)[1] >> NDEF_CMDLIST_LOCKDSFID_POS) & 0x01U) /*!< Returns LockDSFID support flag */ +#define ndefT5TSysInfoGetSystemInformationSupported(cmdList) (((cmdList)[1] >> NDEF_CMDLIST_GETSYSTEMINFORMATION_POS) & 0x01U) /*!< Returns GetSystemInformation support flag */ +#define ndefT5TSysInfoCustomCmdsSupported(cmdList) (((cmdList)[1] >> NDEF_CMDLIST_CUSTOMCMDS_POS) & 0x01U) /*!< Returns CustomCmds support flag */ +#define ndefT5TSysInfoFastReadMultipleBlocksSupported(cmdList) (((cmdList)[1] >> NDEF_CMDLIST_FASTREADMULTIPLEBLOCKS_POS) & 0x01U) /*!< Returns FastReadMultipleBlocks support flag */ + +#define ndefT5TSysInfoExtReadSingleBlockSupported(cmdList) (((cmdList)[2] >> NDEF_CMDLIST_EXTREADSINGLEBLOCK_POS) & 0x01U) /*!< Returns ExtReadSingleBlock support flag */ +#define ndefT5TSysInfoExtWriteSingleBlockSupported(cmdList) (((cmdList)[2] >> NDEF_CMDLIST_EXTWRITESINGLEBLOCK_POS) & 0x01U) /*!< Returns ExtWriteSingleBlock support flag */ +#define ndefT5TSysInfoExtLockSingleBlockSupported(cmdList) (((cmdList)[2] >> NDEF_CMDLIST_EXTLOCKSINGLEBLOCK_POS) & 0x01U) /*!< Returns ExtLockSingleBlock support flag */ +#define ndefT5TSysInfoExtReadMultipleBlocksSupported(cmdList) (((cmdList)[2] >> NDEF_CMDLIST_EXTREADMULTIPLEBLOCKS_POS) & 0x01U) /*!< Returns ExtReadMultipleBlocks support flag */ +#define ndefT5TSysInfoExtWriteMultipleBlocksSupported(cmdList) (((cmdList)[2] >> NDEF_CMDLIST_EXTWRITEMULTIPLEBLOCKS_POS) & 0x01U) /*!< Returns ExtWriteMultipleBlocks support flag */ +#define ndefT5TSysInfoExtGetMultipleBlockSecStatusSupported(cmdList) (((cmdList)[2] >> NDEF_CMDLIST_EXTGETMULTIPLEBLOCKSECSTATUS_POS) & 0x01U) /*!< Returns ExtGetMultipleBlockSecStatus support flag */ +#define ndefT5TSysInfoFastExtendedReadMultipleBlocksSupported(cmdList) (((cmdList)[2] >> NDEF_CMDLIST_FASTEXTENDEDREADMULTIPLEBLOCKS_POS) & 0x01U) /*!< Returns FastExtendedReadMultipleBlocks support flag */ + +#define ndefT5TInvalidateCache(ctx) { (ctx)->subCtx.t5t.cacheBlock = 0xFFFFFFFFU; } /*!< Invalidate the internal cache, before reading a buffer */ +#define ndefT5TIsValidCache(ctx, block) ( (ctx)->subCtx.t5t.cacheBlock == (block) ) /*!< Check the internal cache is valid to avoid useless read */ + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + +/*! T5T Access mode */ +typedef enum { + NDEF_T5T_ACCESS_MODE_SELECTED, + NDEF_T5T_ACCESS_MODE_ADDRESSED, + NDEF_T5T_ACCESS_MODE_NON_ADDRESSED, +} ndefT5TAccessMode; + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/*! + ***************************************************************************** + * \brief Set T5T access mode + * + * This method allows to set the access mode, among addressed, non-addressed + * and selected modes. + * It must be called before calling ndefT5TPollerContextInitialization(). + * + * \param[in] mode : access mode + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT5TPollerSetAccessMode(ndefT5TAccessMode mode); + + +#ifdef TEST_NDEF +/*! + ***************************************************************************** + * \brief Control the Multiple Read Block mode + * + * This method allows to turn on of off the Read Multiple Block feature. + * It will be enabled when the MBREAD bit is set in the CC file. + * It must be called after calling ndefT5TPollerContextInitialization() and + * before ndefT5TPollerNdefDetect(). + * + * \param[in] ctx : ndef Context + * \param[in] enable : enable the feature or not + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT5TPollerMultipleBlockRead(ndefContext *ctx, bool enable); +#endif + + +/*! + ***************************************************************************** + * \brief Handle T5T NDEF context activation + * + * This method performs the initialisation of the NDEF context. + * It must be called after a successfull + * anticollision procedure and prior to any NDEF procedures such as NDEF + * detection procedure. + * + * \param[in] ctx : ndef Context + * \param[in] dev : ndef Device + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT5TPollerContextInitialization(ndefContext *ctx, const ndefDevice *dev); + + +/*! + ***************************************************************************** + * \brief T5T NDEF Detection procedure + * + * This method performs the T5T NDEF Detection procedure + * + * + * \param[in] ctx : ndef Context + * \param[out] info : ndef Information (optional parameter, NULL may be used when no NDEF Information is needed) + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : Detection failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT5TPollerNdefDetect(ndefContext *ctx, ndefInfo *info); + + +/*! + ***************************************************************************** + * \brief T5T Read data from tag memory + * + * This method reads arbitrary length data from tag memory + * + * \param[in] ctx : ndef Context + * \param[in] offset : file offset of where to start reading data + * \param[in] len : requested length + * \param[out] buf : buffer to place the data read from the tag + * \param[out] rcvdLen: received length + * + * \return ERR_WRONG_STATE: Library not initialized or mode not set + * \return ERR_REQUEST : Read failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT5TPollerReadBytes(ndefContext *ctx, uint32_t offset, uint32_t len, uint8_t *buf, uint32_t *rcvdLen); + + +/*! + ***************************************************************************** + * \brief T5T Write data to tag memory + * + * This method writes arbitrary length data to tag memory + * + * \param[in] ctx : ndef Context + * \param[in] offset : file offset where to start writing data + * \param[in] buf : data to write + * \param[in] len : buf length + * \param[in] pad : pad remaining bytes of last modified block with 0s + * \param[in] writeTerminator: write Terminator TLV after data + * + * \return ERR_WRONG_STATE: Library not initialized or mode not set + * \return ERR_REQUEST : Write failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT5TPollerWriteBytes(ndefContext *ctx, uint32_t offset, const uint8_t *buf, uint32_t len, bool pad, bool writeTerminator); + + +/*! + ***************************************************************************** + * \brief T5T Read raw NDEF message + * + * This method reads a raw NDEF message from the current selected file. + * Prior to NDEF Read procedure, a successfull ndefT5TPollerNdefDetect() + * has to be performed. + * + * \param[in] ctx : ndef Context + * \param[out] buf : buffer to place the NDEF message + * \param[in] bufLen : buffer length + * \param[out] rcvdLen: received length + * \param[in] single : performs the procedure as part of a single NDEF read operation + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : read failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT5TPollerReadRawMessage(ndefContext *ctx, uint8_t *buf, uint32_t bufLen, uint32_t *rcvdLen, bool single); + + +/*! + ***************************************************************************** + * \brief T5T Write raw NDEF message + * + * This method writes a raw NDEF message in the current selected file. + * Prior to NDEF Write procedure, a successfull ndefT5TPollerNdefDetect() + * has to be performed. + * + * \param[in] ctx : ndef Context + * \param[in] buf : raw message buffer + * \param[in] bufLen : buffer length + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : write failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT5TPollerWriteRawMessage(ndefContext *ctx, const uint8_t *buf, uint32_t bufLen); + + +/*! + ***************************************************************************** + * \brief T5T Write NDEF message length + * + * This method writes the L field to the tag memory + * + * \param[in] ctx : ndef Context + * \param[in] rawMessageLen : len + * \param[in] writeTerminator: write Terminator TLV after data + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : write failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT5TPollerWriteRawMessageLen(ndefContext *ctx, uint32_t rawMessageLen, bool writeTerminator); + + +/*! + ***************************************************************************** + * \brief T5T Format Tag + * + * This method formats a tag to make it ready for NDEF storage. + * When the cc parameter is provided, the Capability Container is initialized + * with the value provided by the user. + * When the cc parameter is not provided (i.e. NULL), this method + * retrieves the appropriate CC field from (Extended) Get System Information + * or returns ERR_REQUEST if (Extended) Get System Information is not supported. + * The option parameter is used in case of NULL cc parameter to choose + * between Android CC format (default when option = 0) + * or NFC Forum Format (option = NDEF_T5T_FORMAT_OPTION_NFC_FORUM) + * + * + * \param[in] ctx : ndef Context + * \param[in] cc : Capability Container + * \param[in] options : specific flags + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_REQUEST : write failed + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT5TPollerTagFormat(ndefContext *ctx, const ndefCapabilityContainer *cc, uint32_t options); + + +/*! + ***************************************************************************** + * \brief T5T Check Presence + * + * This method checks whether a T5T tag is still present in the operating field + * + * \param[in] ctx : ndef Context + + * + * \return ERR_WRONG_STATE : RFAL not initialized or mode not set + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT5TPollerCheckPresence(ndefContext *ctx); + + +/*! + ***************************************************************************** + * \brief T5T Check Available Space + * + * This method checks whether a T5T tag has enough space to write a message of a given length + * + * \param[in] ctx : ndef Context + * \param[in] messageLen: message length + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NOMEM : not enough space + * \return ERR_NONE : Enough space for message of messageLen length + ***************************************************************************** + */ +ndefStatus ndefT5TPollerCheckAvailableSpace(const ndefContext *ctx, uint32_t messageLen); + + +/*! + ***************************************************************************** + * \brief T5T Begin Write Message + * + * This method sets the L-field to 0 and sets the message offset to the proper value according to messageLen + * + * \param[in] ctx : ndef Context + * \param[in] messageLen: message length + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NOMEM : not enough space + * \return ERR_NONE : Enough space for message of messageLen length + ***************************************************************************** + */ +ndefStatus ndefT5TPollerBeginWriteMessage(ndefContext *ctx, uint32_t messageLen); + + +/*! + ***************************************************************************** + * \brief T5T End Write Message + * + * This method updates the L-field value after the message has been written + * + * \param[in] ctx : ndef Context + * \param[in] messageLen : message length + * \param[in] writeTerminator: write Terminator TLV after data + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NOMEM : not enough space + * \return ERR_NONE : Enough space for message of messageLen length + ***************************************************************************** + */ +ndefStatus ndefT5TPollerEndWriteMessage(ndefContext *ctx, uint32_t messageLen, bool writeTerminator); + + +/*! + ***************************************************************************** + * \brief T5T Set Read Only + * + * This method performs the transition from the READ/WRITE state to the READ-ONLY state + * + * \param[in] ctx : ndef Context + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT5TPollerSetReadOnly(ndefContext *ctx); + + +#endif /* NDEF_T5T_H */ + +/** + * @} + */ diff --git a/components/spi-st25r3911b/NDEF/include/poller/ndef_t5t_hal.h b/components/spi-st25r3911b/NDEF/include/poller/ndef_t5t_hal.h new file mode 100644 index 0000000..435fda6 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/include/poller/ndef_t5t_hal.h @@ -0,0 +1,209 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief Provides NDEF methods and definitions to access NFC Forum Tags + * + * NDEF provides several functionalities required to perform NFC NDEF activities. + *
The NDEF encapsulates the different tag technologies (T2T, T3T, T4AT, T4BT, T5T) + * into a common and easy to use interface. + * + * This file provides the hardware-dependent API to adapt to a given platform + * to benefit from the NDEF generic functionalities. + * The main functions are: + * + *
  ndefT5TisSTDevice() + *
  ndefT5TisT5TDeviceType() + *
  ndefT5TPollerAccessMode() + *
  ndefT5TGetBlockLength() + *
  ndefT5TGetMemoryConfig() + *
  ndefT5TIsMultipleBlockReadSupported() + *
  ndefT5TIsDevicePresent() + *
  ndefT5TLockDevice() + * + * \addtogroup NDEF + * @{ + * + */ + + +#ifndef NDEF_T5T_HAL_H +#define NDEF_T5T_HAL_H + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_config.h" +#include "ndef_poller.h" +#include "ndef_t5t.h" + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL MACROS + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/*! + ***************************************************************************** + * \brief Return whether the device type is a STMicroelectronics device + * + * \param[in] dev: ndef Device + * + * \return true if it is a STMicroelectronics device + ***************************************************************************** + */ +bool ndefT5TisSTDevice(const ndefDevice *dev); + + +/*! + ***************************************************************************** + * \brief Return whether the device type is a T5T device + * + * \param[in] dev: ndef Device + * + * \return true if it is a T5T device + ***************************************************************************** + */ +bool ndefT5TisT5TDevice(const ndefDevice *dev); + + +/*! + ***************************************************************************** + * \brief Set T5T device access mode + * + * \param[in] ctx: ndef Context + * \param[in] dev: ndef Device + * \param[in] mode: Acces mode + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT5TPollerAccessMode(ndefContext *ctx, const ndefDevice *dev, ndefT5TAccessMode mode); + + +/*! + ***************************************************************************** + * \brief Get Block length + * + * This function returns the block length, in bytes + * + * \param[in] ctx: ndef Context + * + * \return 0 if invalid parameter or the block length + ***************************************************************************** + */ +uint8_t ndefT5TGetBlockLength(ndefContext *ctx); + + +/*! + ***************************************************************************** + * \brief Get the memory configuration + * + * This function provides the number of blocks and the block size in the + * T5T system information structure. + * + * \param[in] ctx: ndef Context + * + * \return ERR_PARAM: Invalid parameter + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT5TGetMemoryConfig(ndefContext *ctx); + + +/*! + ***************************************************************************** + * \brief Return whether the device supports Multiple block read + * + * \param[in] ctx: ndef Context + * + * \return true or false + ***************************************************************************** + */ +bool ndefT5TIsMultipleBlockReadSupported(ndefContext *ctx); + + +/*! + ***************************************************************************** + * \brief Check Presence + * + * This method checks whether an NFC tag is still present in the operating field + * + * \param[in] ctx : ndef Context + * + * \return ERR_WRONG_STATE : Library not initialized or mode not set + * \return ERR_PARAM : Invalid parameter + * \return ERR_PROTO : Protocol error + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT5TIsDevicePresent(ndefContext *ctx); + + +/*! + ***************************************************************************** + * \brief This function locks the device + * + * \param[in] ctx: ndef Context + * + * \return ERR_PARAM : Invalid parameter + * \return ERR_NONE : No error + ***************************************************************************** + */ +ndefStatus ndefT5TLockDevice(ndefContext *ctx); + + +#endif /* NDEF_T5T_HAL_H */ + +/** + * @} + * + */ diff --git a/components/spi-st25r3911b/NDEF/source/message/ndef_message.c b/components/spi-st25r3911b/NDEF/source/message/ndef_message.c new file mode 100644 index 0000000..390059f --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/message/ndef_message.c @@ -0,0 +1,317 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF message + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_message.h" +#include "utils.h" + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + +#define NDEF_MAX_RECORD 10U /*!< Maximum number of records */ + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ +static uint8_t ndefRecordPoolIndex = 0; + + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/*****************************************************************************/ +static ndefRecord* ndefAllocRecord(void) +{ + static ndefRecord ndefRecordPool[NDEF_MAX_RECORD]; + + if (ndefRecordPoolIndex >= NDEF_MAX_RECORD) + { + return NULL; + } + + return &ndefRecordPool[ndefRecordPoolIndex++]; +} + + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ +/*****************************************************************************/ + + +ndefStatus ndefMessageInit(ndefMessage* message) +{ + if (message == NULL) + { + return ERR_PARAM; + } + + message->record = NULL; + message->info.length = 0; + message->info.recordCount = 0; + + ndefRecordPoolIndex = 0; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefMessageGetInfo(const ndefMessage* message, ndefMessageInfo* info) +{ + ndefRecord* record; + uint32_t length = 0; + uint32_t recordCount = 0; + + if ( (message == NULL) || (info == NULL) ) + { + return ERR_PARAM; + } + + record = message->record; + + while (record != NULL) + { + length += ndefRecordGetLength(record); + recordCount++; + + record = record->next; + } + + info->length = length; + info->recordCount = recordCount; + + return ERR_NONE; +} + + +/*****************************************************************************/ +uint32_t ndefMessageGetRecordCount(const ndefMessage* message) +{ + ndefMessageInfo info; + + if (ndefMessageGetInfo(message, &info) == ERR_NONE) + { + return info.recordCount; + } + + return 0; +} + + +/*****************************************************************************/ +ndefStatus ndefMessageAppend(ndefMessage* message, ndefRecord* record) +{ + if ( (message == NULL) || (record == NULL) ) + { + return ERR_PARAM; + } + + record->next = NULL; + + if (message->record == NULL) + { + message->record = record; + + /* Set both Message Begin and Message End bits */ + ndefHeaderSetMB(record); + /* Record is appended so it is the last in the list, set the Message End bit */ + ndefHeaderSetME(record); + } + else + { + ndefRecord* current = message->record; + + /* Go through the list of records */ + while (current->next != NULL) + { + current = current->next; + } + + /* Clear the Message End bit to the record before the one being appended */ + ndefHeaderClearME(current); + + /* Append to the last record */ + current->next = record; + + /* Clear the Message Begin bit of appended record */ + ndefHeaderClearMB(record); + /* Record is appended so it is the last in the list, set the Message End bit */ + ndefHeaderSetME(record); + } + + message->info.length += ndefRecordGetLength(record); + message->info.recordCount += 1U; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefMessageDecode(const ndefConstBuffer* bufPayload, ndefMessage* message) +{ + ndefStatus err; + uint32_t offset; + + if ( (bufPayload == NULL) || (bufPayload->buffer == NULL) ) + { + return ERR_PARAM; + } + + err = ndefMessageInit(message); + if (err != ERR_NONE) + { + return err; + } + + offset = 0; + while (offset < bufPayload->length) + { + ndefConstBuffer bufRecord; + ndefRecord* record = ndefAllocRecord(); + if (record == NULL) + { + return ERR_NOMEM; + } + bufRecord.buffer = &bufPayload->buffer[offset]; + bufRecord.length = bufPayload->length - offset; + err = ndefRecordDecode(&bufRecord, record); + if (err != ERR_NONE) + { + return err; + } + offset += ndefRecordGetLength(record); + + err = ndefMessageAppend(message, record); + if (err != ERR_NONE) + { + return err; + } + } + + return ERR_NONE; +} + + +#if NDEF_FEATURE_FULL_API +/*****************************************************************************/ +ndefStatus ndefMessageEncode(const ndefMessage* message, ndefBuffer* bufPayload) +{ + ndefStatus err; + ndefMessageInfo info = {.length = 0U}; + ndefRecord* record; + uint32_t offset; + uint32_t remainingLength; + + if ( (bufPayload == NULL) || (bufPayload->buffer == NULL) ) + { + return ERR_PARAM; + } + + err = ndefMessageGetInfo(message, &info); + if ( (err != ERR_NONE) || (bufPayload->length < info.length) ) + { + bufPayload->length = info.length; + return ERR_NOMEM; + } + + /* Get the first record */ + record = ndefMessageGetFirstRecord(message); + offset = 0; + remainingLength = bufPayload->length; + + while (record != NULL) + { + ndefBuffer bufRecord; + bufRecord.buffer = &bufPayload->buffer[offset]; + bufRecord.length = remainingLength; + err = ndefRecordEncode(record, &bufRecord); + if (err != ERR_NONE) + { + bufPayload->length = info.length; + return err; + } + offset += bufRecord.length; + remainingLength -= bufRecord.length; + + record = ndefMessageGetNextRecord(record); + } + + bufPayload->length = offset; + return ERR_NONE; +} +#endif + + +#if NDEF_FEATURE_FULL_API +/*****************************************************************************/ +ndefRecord* ndefMessageFindRecordType(ndefMessage* message, uint8_t tnf, const ndefConstBuffer8* bufType) +{ + ndefRecord* record; + + record = ndefMessageGetFirstRecord(message); + + while (record != NULL) + { + if (ndefRecordTypeMatch(record, tnf, bufType) == true) + { + return record; + } + + record = ndefMessageGetNextRecord(record); + } + + return record; +} +#endif diff --git a/components/spi-st25r3911b/NDEF/source/message/ndef_record.c b/components/spi-st25r3911b/NDEF/source/message/ndef_record.c new file mode 100644 index 0000000..1c900a7 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/message/ndef_record.c @@ -0,0 +1,623 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF record + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_message.h" +#include "ndef_types.h" +#include "utils.h" + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +#define ndefBufferIsInvalid(buf) (((buf)->buffer == NULL) && ((buf)->length != 0U)) + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL MACROS + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + + +/*****************************************************************************/ +ndefStatus ndefRecordReset(ndefRecord* record) +{ + ndefConstBuffer8 bufEmpty8 = { NULL , 0 }; + ndefConstBuffer bufEmpty = { NULL , 0 }; + + if (record == NULL) + { + return ERR_PARAM; + } + + /* Set the MB and ME bits */ + record->header = ndefHeader(1U, 1U, 0U, 0U, 0U, NDEF_TNF_EMPTY); + + (void)ndefRecordSetType(record, NDEF_TNF_EMPTY, &bufEmpty8); + + (void)ndefRecordSetId(record, &bufEmpty8); + + /* Set the SR bit */ + (void)ndefRecordSetPayload(record, &bufEmpty); + + record->ndeftype = NULL; + + record->next = NULL; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordInit(ndefRecord* record, uint8_t tnf, const ndefConstBuffer8* bufType, const ndefConstBuffer8* bufId, const ndefConstBuffer* bufPayload) +{ + if (record == NULL) + { + return ERR_PARAM; + } + + (void)ndefRecordReset(record); + + (void)ndefRecordSetType(record, tnf, bufType); + + (void)ndefRecordSetId(record, bufId); + + (void)ndefRecordSetPayload(record, bufPayload); + + return ERR_NONE; +} + + +/*****************************************************************************/ +uint32_t ndefRecordGetHeaderLength(const ndefRecord* record) +{ + uint32_t length; + + if (record == NULL) + { + return 0; + } + + length = sizeof(uint8_t); /* header (MB:1 + ME:1 + CF:1 + SR:1 + IL:1 + TNF:3 => 8 bits) */ + length += sizeof(uint8_t); /* Type length */ + if (ndefHeaderIsSetSR(record)) + { + length += sizeof(uint8_t); /* Short record */ + } + else + { + length += sizeof(uint32_t); /* Standard record */ + } + if (ndefHeaderIsSetIL(record)) + { + length += sizeof(uint8_t); /* Id length */ + } + length += record->typeLength; /* Type */ + length += record->idLength; /* Id */ + + return length; +} + + +/*****************************************************************************/ +uint32_t ndefRecordGetLength(const ndefRecord* record) +{ + uint32_t length; + + length = ndefRecordGetHeaderLength(record); /* Header */ + length += ndefRecordGetPayloadLength(record); /* Payload */ + + return length; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordSetType(ndefRecord* record, uint8_t tnf, const ndefConstBuffer8* bufType) +{ + if ( (record == NULL) || + (bufType == NULL) || ndefBufferIsInvalid(bufType) ) + { + return ERR_PARAM; + } + + ndefHeaderSetTNF(record, tnf); + + record->typeLength = bufType->length; + record->type = bufType->buffer; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordGetType(const ndefRecord* record, uint8_t* tnf, ndefConstBuffer8* bufType) +{ + /* Allow to get either tnf or bufType */ + if ( (record == NULL) || ((tnf == NULL) && (bufType == NULL)) ) + { + return ERR_PARAM; + } + + if (tnf != NULL) + { + *tnf = ndefHeaderTNF(record); + } + + if (bufType != NULL) + { + bufType->buffer = record->type; + bufType->length = record->typeLength; + } + + return ERR_NONE; +} + + +/*****************************************************************************/ +bool ndefRecordTypeMatch(const ndefRecord* record, uint8_t tnf, const ndefConstBuffer8* bufType) +{ + if ( (record == NULL) || (bufType == NULL) ) + { + return false; + } + + if ( (ndefHeaderTNF(record) == tnf) && + (record->typeLength == bufType->length) && + (ST_BYTECMP(record->type, bufType->buffer, bufType->length) == 0) ) + { + return true; + } + + return false; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordSetId(ndefRecord* record, const ndefConstBuffer8* bufId) +{ + if ( (record == NULL) || + (bufId == NULL) || ndefBufferIsInvalid(bufId) ) + { + return ERR_PARAM; + } + + if (bufId->buffer != NULL) + { + ndefHeaderSetIL(record); + } + else + { + ndefHeaderClearIL(record); + } + + record->id = bufId->buffer; + record->idLength = bufId->length; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordGetId(const ndefRecord* record, ndefConstBuffer8* bufId) +{ + if ( (record == NULL) || (bufId == NULL) ) + { + return ERR_PARAM; + } + + bufId->buffer = record->id; + bufId->length = record->idLength; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordSetPayload(ndefRecord* record, const ndefConstBuffer* bufPayload) +{ + if ( (record == NULL) || + (bufPayload == NULL) || ndefBufferIsInvalid(bufPayload) ) + { + return ERR_PARAM; + } + + ndefHeaderSetValueSR(record, (bufPayload->length <= NDEF_SHORT_RECORD_LENGTH_MAX) ? 1 : 0); + + record->bufPayload.buffer = bufPayload->buffer; + record->bufPayload.length = bufPayload->length; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordGetPayload(const ndefRecord* record, ndefConstBuffer* bufPayload) +{ + if ( (record == NULL) || (bufPayload == NULL) ) + { + return ERR_PARAM; + } + + bufPayload->buffer = record->bufPayload.buffer; + bufPayload->length = record->bufPayload.length; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordDecode(const ndefConstBuffer* bufPayload, ndefRecord* record) +{ + uint32_t offset; + + if ( (bufPayload == NULL) || (bufPayload->buffer == NULL) || (record == NULL) ) + { + return ERR_PARAM; + } + + if (ndefRecordReset(record) != ERR_NONE) + { + return ERR_INTERNAL; + } + + /* Get "header" byte */ + offset = 0; + if ((offset + sizeof(uint8_t)) > bufPayload->length) + { + return ERR_PROTO; + } + record->header = bufPayload->buffer[offset]; + offset++; + + /* Get Type length */ + if ((offset + sizeof(uint8_t)) > bufPayload->length) + { + return ERR_PROTO; + } + record->typeLength = bufPayload->buffer[offset]; + offset++; + + /* Decode Payload length */ + if (ndefHeaderIsSetSR(record)) + { + /* Short record */ + if ((offset + sizeof(uint8_t)) > bufPayload->length) + { + return ERR_PROTO; + } + record->bufPayload.length = bufPayload->buffer[offset]; /* length stored on a single byte for Short Record */ + offset++; + } + else + { + /* Standard record */ + if ((offset + sizeof(uint32_t)) > bufPayload->length) + { + return ERR_PROTO; + } + record->bufPayload.length = GETU32(&bufPayload->buffer[offset]); + offset += sizeof(uint32_t); + } + + /* Get Id length */ + if (ndefHeaderIsSetIL(record)) + { + if ((offset + sizeof(uint8_t)) > bufPayload->length) + { + return ERR_PROTO; + } + record->idLength = bufPayload->buffer[offset]; + offset++; + } + else + { + record->idLength = 0; + } + + /* Get Type */ + if (record->typeLength > 0U) + { + if ((offset + record->typeLength) > bufPayload->length) + { + return ERR_PROTO; + } + record->type = &bufPayload->buffer[offset]; + offset += record->typeLength; + } + else + { + record->type = NULL; + } + + /* Get Id */ + if (record->idLength > 0U) + { + if ((offset + record->idLength) > bufPayload->length) + { + return ERR_PROTO; + } + record->id = &bufPayload->buffer[offset]; + offset += record->idLength; + } + else + { + record->id = NULL; + } + + /* Get Payload */ + if (record->bufPayload.length > 0U) + { + if ((offset + record->bufPayload.length) > bufPayload->length) + { + return ERR_PROTO; + } + record->bufPayload.buffer = &bufPayload->buffer[offset]; + } + else + { + record->bufPayload.buffer = NULL; + } + + record->next = NULL; + + return ERR_NONE; +} + + +#if NDEF_FEATURE_FULL_API +/*****************************************************************************/ +ndefStatus ndefRecordEncodeHeader(const ndefRecord* record, ndefBuffer* bufHeader) +{ + uint32_t offset; + uint32_t payloadLength; + + if ( (record == NULL) || (bufHeader == NULL) || (bufHeader->buffer == NULL) ) + { + return ERR_PARAM; + } + + if (bufHeader->length < NDEF_RECORD_HEADER_LEN) + { + bufHeader->length = NDEF_RECORD_HEADER_LEN; + return ERR_NOMEM; + } + + /* Start encoding the record */ + offset = 0; + bufHeader->buffer[offset] = record->header; + offset++; + + /* Set Type length */ + bufHeader->buffer[offset] = record->typeLength; + offset++; + + /* Encode Payload length */ + payloadLength = ndefRecordGetPayloadLength(record); + + if (payloadLength <= NDEF_SHORT_RECORD_LENGTH_MAX) + { + /* Short record */ + bufHeader->buffer[offset] = (uint8_t)payloadLength; + offset++; + } + else + { + /* Standard record */ + bufHeader->buffer[offset] = (uint8_t)(payloadLength >> 24); + offset++; + bufHeader->buffer[offset] = (uint8_t)(payloadLength >> 16); + offset++; + bufHeader->buffer[offset] = (uint8_t)(payloadLength >> 8); + offset++; + bufHeader->buffer[offset] = (uint8_t)(payloadLength); + offset++; + } + + /* Encode Id length */ + if (ndefHeaderIsSetIL(record)) + { + bufHeader->buffer[offset] = record->idLength; + offset++; + } + + bufHeader->length = offset; + + return ERR_NONE; +} + + +/*****************************************************************************/ +static ndefStatus ndefRecordEncodePayload(const ndefRecord* record, ndefBuffer* bufPayload) +{ + uint32_t payloadLength; + uint32_t offset; + bool begin; + ndefConstBuffer bufPayloadItem; + + if (bufPayload == NULL) + { + return ERR_PARAM; + } + + payloadLength = ndefRecordGetPayloadLength(record); + if (payloadLength > bufPayload->length) + { + return ERR_NOMEM; + } + + begin = true; + offset = 0; + while (ndefRecordGetPayloadItem(record, &bufPayloadItem, begin) != NULL) + { + begin = false; + if (bufPayloadItem.length > 0U) + { + ST_MEMCPY(&bufPayload->buffer[offset], bufPayloadItem.buffer, bufPayloadItem.length); + } + offset += bufPayloadItem.length; + } + + bufPayload->length = offset; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordEncode(const ndefRecord* record, ndefBuffer* bufRecord) +{ + ndefStatus err; + ndefBuffer bufHeader; + ndefBuffer bufPayload; + uint32_t offset; + + if ( (record == NULL) || (bufRecord == NULL) || (bufRecord->buffer == NULL) ) + { + return ERR_PARAM; + } + + if (bufRecord->length < ndefRecordGetLength(record)) + { + bufRecord->length = ndefRecordGetLength(record); + return ERR_NOMEM; + } + + /* Encode header at the beginning of buffer provided */ + bufHeader = *bufRecord; /* Copy ndefBuffer fields */ + err = ndefRecordEncodeHeader(record, &bufHeader); + if (err != ERR_NONE) + { + return err; + } + + offset = bufHeader.length; + + /* Set Type */ + if (record->typeLength > 0U) + { + (void)ST_MEMCPY(&bufRecord->buffer[offset], record->type, record->typeLength); + offset += record->typeLength; + } + + /* Set Id */ + if (record->idLength > 0U) + { + (void)ST_MEMCPY(&bufRecord->buffer[offset], record->id, record->idLength); + offset += record->idLength; + } + + /* Set Payload */ + bufPayload.buffer = &bufRecord->buffer[offset]; + bufPayload.length = bufRecord->length - offset; + err = ndefRecordEncodePayload(record, &bufPayload); + if (err != ERR_NONE) + { + return err; + } + + bufRecord->length = offset + bufPayload.length; + + return ERR_NONE; +} +#endif + + +/*****************************************************************************/ +uint32_t ndefRecordGetPayloadLength(const ndefRecord* record) +{ + uint32_t payloadLength; + + if (record == NULL) + { + return 0; + } + + if ( (record->ndeftype != NULL) && (record->ndeftype->getPayloadLength != NULL) ) + { + payloadLength = record->ndeftype->getPayloadLength(record->ndeftype); + } + else + { + payloadLength = record->bufPayload.length; + } + + return payloadLength; +} + + +/*****************************************************************************/ +const uint8_t* ndefRecordGetPayloadItem(const ndefRecord* record, ndefConstBuffer* bufPayloadItem, bool begin) +{ + if ( (record == NULL) || (bufPayloadItem == NULL) ) + { + return NULL; + } + + bufPayloadItem->buffer = NULL; + bufPayloadItem->length = 0; + + if ( (record->ndeftype != NULL) && (record->ndeftype->getPayloadItem != NULL) ) + { + record->ndeftype->getPayloadItem(record->ndeftype, bufPayloadItem, begin); + } + else + { + if (begin == true) + { + (void)ndefRecordGetPayload(record, bufPayloadItem); + } + } + + return bufPayloadItem->buffer; +} diff --git a/components/spi-st25r3911b/NDEF/source/message/ndef_type_aar.c b/components/spi-st25r3911b/NDEF/source/message/ndef_type_aar.c new file mode 100644 index 0000000..9c742f2 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/message/ndef_type_aar.c @@ -0,0 +1,171 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF RTD Android Application Record (AAR) type + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_types.h" +#include "ndef_type_aar.h" +#include "utils.h" + + +#if NDEF_TYPE_RTD_AAR_SUPPORT + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + + +/*! RTD Type strings */ +static const uint8_t ndefRtdTypeAar[] = "android.com:pkg"; /*!< External Type (Android Application Record) */ + +const ndefConstBuffer8 bufRtdTypeAar = { ndefRtdTypeAar, sizeof(ndefRtdTypeAar) - 1U }; /*!< AAR External Type Record buffer */ + + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + + +/* + * NFC Forum External Type (Android Application Record) + */ + + +/*****************************************************************************/ +ndefStatus ndefRtdAarInit(ndefType* aar, const ndefConstBuffer* bufPayload) +{ + ndefTypeRtdAar* rtdAar; + + if ( (aar == NULL) || (bufPayload == NULL) ) + { + return ERR_PARAM; + } + + aar->id = NDEF_TYPE_ID_RTD_AAR; + aar->getPayloadLength = NULL; + aar->getPayloadItem = NULL; + aar->typeToRecord = ndefRtdAarToRecord; + rtdAar = &aar->data.aar; + + rtdAar->bufType.buffer = bufRtdTypeAar.buffer; + rtdAar->bufType.length = bufRtdTypeAar.length; + rtdAar->bufPayload.buffer = bufPayload->buffer; + rtdAar->bufPayload.length = bufPayload->length; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefGetRtdAar(const ndefType* aar, ndefConstBuffer* bufAarString) +{ + const ndefTypeRtdAar* rtdAar; + + if ( (aar == NULL) || (aar->id != NDEF_TYPE_ID_RTD_AAR) || + (bufAarString == NULL) ) + { + return ERR_PARAM; + } + + rtdAar = &aar->data.aar; + + bufAarString->buffer = rtdAar->bufPayload.buffer; + bufAarString->length = rtdAar->bufPayload.length; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordToRtdAar(const ndefRecord* record, ndefType* aar) +{ + if ( (record == NULL) || (aar == NULL) ) + { + return ERR_PARAM; + } + + if ( ! ndefRecordTypeMatch(record, NDEF_TNF_RTD_EXTERNAL_TYPE, &bufRtdTypeAar)) /* "android.com:pkg" */ + { + return ERR_PROTO; + } + + /* No constraint on payload length */ + + return ndefRtdAarInit(aar, &record->bufPayload); +} + + +/*****************************************************************************/ +ndefStatus ndefRtdAarToRecord(const ndefType* aar, ndefRecord* record) +{ + const ndefTypeRtdAar* rtdAar; + + if ( (aar == NULL) || (aar->id != NDEF_TYPE_ID_RTD_AAR) || + (record == NULL) ) + { + return ERR_PARAM; + } + + rtdAar = &aar->data.aar; + + (void)ndefRecordReset(record); + + /* "android.com:pkg" */ + (void)ndefRecordSetType(record, NDEF_TNF_RTD_EXTERNAL_TYPE, &bufRtdTypeAar); + + (void)ndefRecordSetPayload(record, &rtdAar->bufPayload); + + return ERR_NONE; +} + +#endif diff --git a/components/spi-st25r3911b/NDEF/source/message/ndef_type_bluetooth.c b/components/spi-st25r3911b/NDEF/source/message/ndef_type_bluetooth.c new file mode 100644 index 0000000..ee9bb2e --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/message/ndef_type_bluetooth.c @@ -0,0 +1,808 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2020 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF Bluetooth type + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_types.h" +#include "ndef_type_bluetooth.h" +#include "utils.h" + + +#if NDEF_TYPE_BLUETOOTH_SUPPORT + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + +/*! Bluetooth Payload minimal length */ +#define NDEF_BLUETOOTH_BREDR_PAYLOAD_LENGTH_MIN 8U +#define NDEF_BLUETOOTH_SECURE_LE_PAYLOAD_LENGTH_MIN 2U +#define NDEF_BLUETOOTH_PAYLOAD_LENGTH_MIN (MIN(NDEF_BLUETOOTH_BREDR_PAYLOAD_LENGTH_MIN, NDEF_BLUETOOTH_SECURE_LE_PAYLOAD_LENGTH_MIN)) + + +/*! EIR length */ +#define NDEF_BT_EIR_DEVICE_ADDRESS_SIZE 6U +#define NDEF_BT_EIR_BLE_DEVICE_ADDRESS_SIZE 6U +#define NDEF_BT_EIR_DEVICE_CLASS_SIZE 3U +#define NDEF_BT_EIR_SIMPLE_PAIRING_HASH_SIZE 16U +#define NDEF_BT_EIR_SIMPLE_PAIRING_RANDOMIZER_SIZE 16U +#define NDEF_BT_EIR_SECURE_CO_CONFIRMATION_VALUE_SIZE 16U +#define NDEF_BT_EIR_SECURE_CO_RANDOM_VALUE_SIZE 16U +#define NDEF_BT_EIR_SECURITY_MANAGER_TK_SIZE 16U +#define NDEF_BT_EIR_SLAVE_CONNECTION_INTERVAL_RANGE_SIZE (2U * sizeof(uint16_t)) + + +/*! Enable EIR length check while decoding payload */ +#define NDEF_BLUETOOTH_CHECK_REFERENCE_LENGTH + +/*! Encode 0-length data EIRs */ +#define NDEF_BLUETOOTH_ENCODE_EMPTY_DATA_EIR + +/*! EIR Length-Type-Data fields offsets */ +#define NDEF_BT_EIR_LENGTH_OFFSET 0U +#define NDEF_BT_EIR_TYPE_OFFSET 1U +#define NDEF_BT_EIR_DATA_OFFSET 2U + + +/* + ****************************************************************************** + * LOCAL TYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + + +/*! Bluetooth Type strings */ +static const uint8_t ndefTypeBluetoothBrEdr[] = "application/vnd.bluetooth.ep.oob"; /*!< Bluetooth BR/EDR Out-Of-Band Record Type */ +static const uint8_t ndefTypeBluetoothLe[] = "application/vnd.bluetooth.le.oob"; /*!< Bluetooth Low Energy Out-Of-Band Record Type */ +static const uint8_t ndefTypeBluetoothSecureBrEdr[] = "application/vnd.bluetooth.secure.ep.oob"; /*!< Bluetooth Secure BR/EDR Out-Of-Band Record Type */ +static const uint8_t ndefTypeBluetoothSecureLe[] = "application/vnd.bluetooth.secure.le.oob"; /*!< Bluetooth Secure Low Energy Out-Of-Band Record type */ + +const ndefConstBuffer8 bufMediaTypeBluetoothBrEdr = { ndefTypeBluetoothBrEdr, sizeof(ndefTypeBluetoothBrEdr) - 1U }; /*!< Bluetooth BR/EDR Record Type buffer */ +const ndefConstBuffer8 bufMediaTypeBluetoothLe = { ndefTypeBluetoothLe, sizeof(ndefTypeBluetoothLe) - 1U }; /*!< Bluetooth Low Energy Record Type buffer */ +const ndefConstBuffer8 bufMediaTypeBluetoothSecureBrEdr = { ndefTypeBluetoothSecureBrEdr, sizeof(ndefTypeBluetoothSecureBrEdr) - 1U }; /*!< Bluetooth Secure BR/EDR Record Type buffer */ +const ndefConstBuffer8 bufMediaTypeBluetoothSecureLe = { ndefTypeBluetoothSecureLe, sizeof(ndefTypeBluetoothSecureLe) - 1U }; /*!< Bluetooth Secure Low Energy Record Type buffer */ + + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + + +/* + * Bluetooth OOB + */ + + +/* EIR Helper functions */ + + +/*****************************************************************************/ +uint8_t ndefBluetoothEirLength(const uint8_t* eir) +{ + if (eir == NULL) + { + return 0; + } + + uint8_t length = eir[NDEF_BT_EIR_LENGTH_OFFSET]; + /* Check the EIR contains something */ + if (length != 0U) + { + /* Add the Length byte that is not included in the EIR length */ + length += (uint8_t)sizeof(uint8_t); + } + + return length; +} + + +/*****************************************************************************/ +uint8_t ndefBluetoothEirDataLength(const uint8_t* eir) +{ + if (eir == NULL) + { + return 0; + } + + uint8_t dataLength = eir[NDEF_BT_EIR_LENGTH_OFFSET]; + /* Check the EIR contains a type */ + if (dataLength > 0U) + { + dataLength -= (uint8_t)sizeof(uint8_t); /* Remove the EIR Type byte */ + } + + return dataLength; +} + + +/*****************************************************************************/ +uint8_t ndefBluetoothEirType(const uint8_t* eir) +{ + uint8_t type = 0; + + if (ndefBluetoothEirLength(eir) != 0U) + { + type = eir[NDEF_BT_EIR_TYPE_OFFSET]; + } + + return type; +} + + +/*****************************************************************************/ +const uint8_t* ndefBluetoothEirData(const uint8_t* eir) +{ + const uint8_t* data = NULL; + + if (ndefBluetoothEirDataLength(eir) != 0U) + { + data = &eir[NDEF_BT_EIR_DATA_OFFSET]; + } + + return data; +} + + +/*****************************************************************************/ +ndefStatus ndefBluetoothEirDataToBuffer(const uint8_t* eir, ndefConstBuffer* bufEir) +{ + if ( (eir == NULL) || (bufEir == NULL) ) + { + return ERR_PARAM; + } + + bufEir->buffer = ndefBluetoothEirData(eir); + bufEir->length = ndefBluetoothEirDataLength(eir); + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefBluetoothSetEir(ndefTypeBluetooth* bluetooth, const uint8_t* eir) +{ + if ( (bluetooth == NULL) || (eir == NULL) ) + { + return ERR_PARAM; + } + + /* Find first free EIR */ + for (uint32_t i = 0; i < (uint32_t)SIZEOF_ARRAY(bluetooth->eir); i++) + { + /* Append it */ + if (bluetooth->eir[i] == NULL) + { + bluetooth->eir[i] = eir; + return ERR_NONE; + } + /* Or update existing one */ + else if (ndefBluetoothEirType(bluetooth->eir[i]) == ndefBluetoothEirType(eir)) + { + bluetooth->eir[i] = eir; + return ERR_NONE; + } + else + { + /* MISRA 15.7 - Empty else */ + } + } + + return ERR_NOMEM; +} + + +/*****************************************************************************/ +const uint8_t* ndefBluetoothGetEir(const ndefTypeBluetooth* bluetooth, uint8_t eirType) +{ + if (bluetooth == NULL) + { + return NULL; + } + + /* Find EIR with this type */ + for (uint32_t i = 0; i < (uint32_t)SIZEOF_ARRAY(bluetooth->eir); i++) + { + if (ndefBluetoothEirType(bluetooth->eir[i]) == eirType) + { + return bluetooth->eir[i]; + } + } + + return NULL; +} + + +/*****************************************************************************/ +/* This function copies an array, changing its endianness, useful to convert data to BLE endianess */ +static uint8_t* NDEF_BluetoothReverse(uint8_t* dst, const uint8_t* src, uint32_t length) +{ + if ( (dst == NULL) || (src == NULL) ) + { + return NULL; + } + + for(uint32_t i = 0; i < length; i++) + { + dst[i] = src[length - i - 1U]; + } + + return dst; +} + + +/*****************************************************************************/ +ndefStatus ndefBluetoothGetEirData(const ndefTypeBluetooth* bluetooth, uint8_t eirType, ndefConstBuffer* bufData) +{ + if ( (bluetooth == NULL) || (bufData == NULL) ) + { + return ERR_PARAM; + } + + const uint8_t* eir = ndefBluetoothGetEir(bluetooth, eirType); + + return ndefBluetoothEirDataToBuffer(eir, bufData); +} + + +/*****************************************************************************/ +ndefStatus ndefBluetoothGetEirDataReversed(const ndefTypeBluetooth* bluetooth, uint8_t eirType, ndefBuffer* bufDataReversed) +{ + if ( (bluetooth == NULL) || (bufDataReversed == NULL) ) + { + return ERR_PARAM; + } + + const uint8_t* eir = ndefBluetoothGetEir(bluetooth, eirType); + + uint32_t data_length = ndefBluetoothEirDataLength(eir); + if (data_length > bufDataReversed->length) + { + bufDataReversed->length = data_length; + return ERR_NOMEM; + } + bufDataReversed->length = data_length; + + const uint8_t* eir_data = ndefBluetoothEirData(eir); + (void)NDEF_BluetoothReverse(bufDataReversed->buffer, eir_data, data_length); + + return ERR_NONE; +} + + +/*****************************************************************************/ +static uint32_t ndefBluetoothPayloadGetLength(const ndefType* type) +{ + const ndefTypeBluetooth* ndefData; + uint32_t length = 0; + + if ( (type == NULL) || + ( (type->id != NDEF_TYPE_ID_BLUETOOTH_BREDR) && + (type->id != NDEF_TYPE_ID_BLUETOOTH_LE) && + (type->id != NDEF_TYPE_ID_BLUETOOTH_SECURE_BREDR) && + (type->id != NDEF_TYPE_ID_BLUETOOTH_SECURE_LE) ) ) + { + return 0; + } + + ndefData = &type->data.bluetooth; + + /* For both BR/EDR and Secure LE */ + if ( (type->id == NDEF_TYPE_ID_BLUETOOTH_BREDR) || + (type->id == NDEF_TYPE_ID_BLUETOOTH_SECURE_LE) ) + { + length = sizeof(uint16_t); /* 2 bytes for length */ + } + + /* For BR/EDR only, but no test needed because length is 0 in that case */ + length += ndefData->bufDeviceAddress.length; + + /* Go through all EIRs */ + for (uint32_t i = 0; i < (uint32_t)SIZEOF_ARRAY(ndefData->eir); i++) + { +#ifdef NDEF_BLUETOOTH_ENCODE_EMPTY_DATA_EIR + /* Send all/valid EIRs (even EIRs with data length == 0) */ +#else + /* Send EIRs with data length != 0U only */ + if (ndefBluetoothGetEirDataLength(ndefDtata->eir[i]) != 0U) +#endif + { + length += ndefBluetoothEirLength(ndefData->eir[i]); + } + } + + return length; +} + + +/*****************************************************************************/ +ndefStatus ndefBluetoothReset(ndefTypeBluetooth* bluetooth) +{ + ndefConstBuffer bufEmpty = { NULL, 0 }; + + if (bluetooth == NULL) + { + return ERR_PARAM; + } + + /* Initialize ndefBuffer */ + bluetooth->bufDeviceAddress = bufEmpty; + + /* Initialize all EIRs */ + for (uint32_t i = 0; i < (uint32_t)SIZEOF_ARRAY(bluetooth->eir); i++) + { + bluetooth->eir[i] = NULL; + } + + return ERR_NONE; +} + + +/*****************************************************************************/ +static const uint8_t* ndefBluetoothToPayloadItem(const ndefType* type, ndefConstBuffer* bufItem, bool begin) +{ + static uint32_t item = 0; + static uint32_t eirId = 0; + + const ndefTypeBluetooth* ndefData; + + if ( (type == NULL) || (bufItem == NULL) || + ( (type->id != NDEF_TYPE_ID_BLUETOOTH_BREDR) && + (type->id != NDEF_TYPE_ID_BLUETOOTH_LE) && + (type->id != NDEF_TYPE_ID_BLUETOOTH_SECURE_BREDR) && + (type->id != NDEF_TYPE_ID_BLUETOOTH_SECURE_LE) ) ) + { + return NULL; + } + + ndefData = &type->data.bluetooth; + + bufItem->buffer = NULL; + bufItem->length = 0; + + /* Initialization */ + if (begin == true) + { + item = 0; + eirId = 0; + } + + /* BR/EDR or Secure Low Energy */ + if ( (type->id == NDEF_TYPE_ID_BLUETOOTH_BREDR) || + (type->id == NDEF_TYPE_ID_BLUETOOTH_SECURE_LE) ) + { + if (item == 0U) + { + /* for BR-EDR and Secure LE, Device address & length are managed outside EIR */ + /* First item for NDEF_TYPE_ID_BLUETOOTH_BREDR: Payload length */ + static uint16_t len; + len = (uint16_t)ndefBluetoothPayloadGetLength(type); + bufItem->buffer = (const uint8_t*)&len; + bufItem->length = sizeof(uint16_t); + + item++; + return bufItem->buffer; + } + } + if (type->id == NDEF_TYPE_ID_BLUETOOTH_BREDR) + { + if (item == 1U) + { + /* for BR-EDR Device address & length are managed outside EIR */ + /* Second item for NDEF_TYPE_ID_BLUETOOTH_BREDR: Device Address */ + bufItem->buffer = ndefData->bufDeviceAddress.buffer; + bufItem->length = ndefData->bufDeviceAddress.length; + + item++; + return bufItem->buffer; + } + } + + /* Go through all EIRs */ + while (eirId < (uint32_t)SIZEOF_ARRAY(ndefData->eir)) + { +#ifdef NDEF_BLUETOOTH_ENCODE_EMPTY_DATA_EIR + /* Send all/valid EIRs (even EIRs with data length == 0) */ + if (ndefBluetoothEirLength(ndefData->eir[eirId]) != 0U) +#else + /* Send EIRs with data length != 0U only */ + if (ndefBluetoothEirDataLength(ndefData->eir[eirId]) != 0U) +#endif + { + bufItem->buffer = (const uint8_t*)ndefData->eir[eirId]; + bufItem->length = ndefBluetoothEirLength(ndefData->eir[eirId]); + + eirId++; + return bufItem->buffer; + } + eirId++; + } + + return bufItem->buffer; +} + + +/*****************************************************************************/ +static ndefStatus ndefBluetoothInit(ndefType* type, const ndefTypeBluetooth* bluetooth) +{ + ndefTypeBluetooth* ndefData; + + if ( (type == NULL) || (bluetooth == NULL) ) + { + return ERR_PARAM; + } + + /* type->id set by the caller */ + type->getPayloadLength = ndefBluetoothPayloadGetLength; + type->getPayloadItem = ndefBluetoothToPayloadItem; + type->typeToRecord = ndefBluetoothToRecord; + ndefData = &type->data.bluetooth; + + /* Copy in a bulk */ + (void)ST_MEMCPY(ndefData, bluetooth, sizeof(ndefTypeBluetooth)); + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefBluetoothBrEdrInit(ndefType* type, const ndefTypeBluetooth* bluetooth) +{ + if (type == NULL) + { + return ERR_PARAM; + } + + /* Initialize a Basic Rate/Enhanced Data Rate type */ + type->id = NDEF_TYPE_ID_BLUETOOTH_BREDR; + + return ndefBluetoothInit(type, bluetooth); +} + + +/*****************************************************************************/ +ndefStatus ndefBluetoothLeInit(ndefType* type, const ndefTypeBluetooth* bluetooth) +{ + if (type == NULL) + { + return ERR_PARAM; + } + + /* Initialize a Bluetooth Low Energy type */ + type->id = NDEF_TYPE_ID_BLUETOOTH_LE; + + return ndefBluetoothInit(type, bluetooth); +} + + +/*****************************************************************************/ +ndefStatus ndefBluetoothSecureBrEdrInit(ndefType* type, const ndefTypeBluetooth* bluetooth) +{ + if (type == NULL) + { + return ERR_PARAM; + } + + /* Initialize a Secure BR/EDR type */ + type->id = NDEF_TYPE_ID_BLUETOOTH_SECURE_BREDR; + + return ndefBluetoothInit(type, bluetooth); +} + + +/*****************************************************************************/ +ndefStatus ndefBluetoothSecureLeInit(ndefType* type, const ndefTypeBluetooth* bluetooth) +{ + if (type == NULL) + { + return ERR_PARAM; + } + + /* Initialize a Secure Low Energy type */ + type->id = NDEF_TYPE_ID_BLUETOOTH_SECURE_LE; + + return ndefBluetoothInit(type, bluetooth); +} + + +/*****************************************************************************/ +ndefStatus ndefGetBluetooth(const ndefType* type, ndefTypeBluetooth* bluetooth) +{ + const ndefTypeBluetooth* ndefData; + + if ( (type == NULL) || (bluetooth == NULL) || + ( (type->id != NDEF_TYPE_ID_BLUETOOTH_BREDR) && + (type->id != NDEF_TYPE_ID_BLUETOOTH_LE) && + (type->id != NDEF_TYPE_ID_BLUETOOTH_SECURE_BREDR) && + (type->id != NDEF_TYPE_ID_BLUETOOTH_SECURE_LE) ) ) + { + return ERR_PARAM; + } + + ndefData = &type->data.bluetooth; + + /* Copy in a bulk */ + (void)ST_MEMCPY(bluetooth, ndefData, sizeof(ndefTypeBluetooth)); + + return ERR_NONE; +} + + +/*****************************************************************************/ +#ifdef NDEF_BLUETOOTH_CHECK_REFERENCE_LENGTH +static uint32_t ndefBluetoothEirRefLength(uint8_t eirType) +{ + uint32_t length; + switch (eirType) + { + case NDEF_BT_EIR_FLAGS : length = sizeof(uint8_t) ; break; + case NDEF_BT_EIR_TX_POWER_LEVEL : length = sizeof(uint8_t) ; break; + case NDEF_BT_EIR_DEVICE_CLASS : length = NDEF_BT_EIR_DEVICE_CLASS_SIZE ; break; + case NDEF_BT_EIR_SIMPLE_PAIRING_HASH : length = NDEF_BT_EIR_SIMPLE_PAIRING_HASH_SIZE ; break; + case NDEF_BT_EIR_SIMPLE_PAIRING_RANDOMIZER : length = NDEF_BT_EIR_SIMPLE_PAIRING_RANDOMIZER_SIZE ; break; + case NDEF_BT_EIR_SECURITY_MANAGER_TK_VALUE : length = NDEF_BT_EIR_SECURITY_MANAGER_TK_SIZE ; break; + case NDEF_BT_EIR_SECURITY_MANAGER_FLAGS : length = sizeof(uint8_t) ; break; + case NDEF_BT_EIR_SLAVE_CONNECTION_INTERVAL_RANGE : length = NDEF_BT_EIR_SLAVE_CONNECTION_INTERVAL_RANGE_SIZE ; break; + case NDEF_BT_EIR_LE_DEVICE_ADDRESS : length = NDEF_BT_EIR_BLE_DEVICE_ADDRESS_SIZE + sizeof(uint8_t); break; + case NDEF_BT_EIR_LE_ROLE : length = sizeof(uint8_t) ; break; + case NDEF_BT_EIR_LE_SECURE_CONN_CONFIRMATION_VALUE: length = NDEF_BT_EIR_SECURE_CO_CONFIRMATION_VALUE_SIZE ; break; + case NDEF_BT_EIR_LE_SECURE_CONN_RANDOM_VALUE : length = NDEF_BT_EIR_SECURE_CO_RANDOM_VALUE_SIZE ; break; + default: + /* No length constraint on the following EIRs: */ + /* NDEF_BT_EIR_SERVICE_CLASS_UUID_PARTIAL_16 */ + /* NDEF_BT_EIR_SERVICE_CLASS_UUID_COMPLETE_16 */ + /* NDEF_BT_EIR_SERVICE_CLASS_UUID_PARTIAL_32 */ + /* NDEF_BT_EIR_SERVICE_CLASS_UUID_COMPLETE_32 */ + /* NDEF_BT_EIR_SERVICE_CLASS_UUID_PARTIAL_128 */ + /* NDEF_BT_EIR_SERVICE_CLASS_UUID_COMPLETE_128 */ + /* NDEF_BT_EIR_SHORT_LOCAL_NAME */ + /* NDEF_BT_EIR_COMPLETE_LOCAL_NAME */ + /* NDEF_BT_EIR_SERVICE_SOLICITATION_16 */ + /* NDEF_BT_EIR_SERVICE_SOLICITATION_128 */ + /* NDEF_BT_EIR_SERVICE_DATA */ + /* NDEF_BT_EIR_APPEARANCE */ + /* NDEF_BT_EIR_MANUFACTURER_DATA */ + length = 0; + break; + } + + return length; +} +#endif + + +/*****************************************************************************/ +static ndefStatus ndefPayloadToBluetooth(const ndefConstBuffer* bufPayload, ndefTypeId typeId, ndefType* type) +{ + ndefTypeBluetooth* ndefData; + + if ( (bufPayload == NULL) || (bufPayload->buffer == NULL) || + (type == NULL) ) + { + return ERR_PARAM; + } + + if (bufPayload->length < NDEF_BLUETOOTH_PAYLOAD_LENGTH_MIN) /* Bluetooth Payload Min */ + { + return ERR_PROTO; + } + + /* MISRA complains that this conditional expression is always false, so comment it out */ + /* if ( (typeId != NDEF_TYPE_ID_BLUETOOTH_BREDR) && + (typeId != NDEF_TYPE_ID_BLUETOOTH_BLE) && + (typeId != NDEF_TYPE_ID_BLUETOOTH_SECURE_LE) ) + { + return ERR_PARAM; + } */ + + type->id = typeId; + type->getPayloadLength = ndefBluetoothPayloadGetLength; + type->getPayloadItem = ndefBluetoothToPayloadItem; + type->typeToRecord = ndefBluetoothToRecord; + ndefData = &type->data.bluetooth; + + /* Reset every field */ + if (ndefBluetoothReset(ndefData) != ERR_NONE) + { + return ERR_PARAM; + } + + uint32_t offset = 0; + + /* Extract data from the payload */ + if ( (typeId == NDEF_TYPE_ID_BLUETOOTH_BREDR) || + (typeId == NDEF_TYPE_ID_BLUETOOTH_SECURE_LE) ) + { + uint16_t length = bufPayload->buffer[offset]; + NO_WARNING(length); + offset += sizeof(uint16_t); + + /* Could check length and bufPayload->length match */ + } + if (typeId == NDEF_TYPE_ID_BLUETOOTH_BREDR) + { + ndefData->bufDeviceAddress.buffer = &bufPayload->buffer[offset]; + ndefData->bufDeviceAddress.length = NDEF_BT_EIR_DEVICE_ADDRESS_SIZE; + offset += NDEF_BT_EIR_DEVICE_ADDRESS_SIZE; + } + + while (offset < bufPayload->length) + { + const uint8_t* eir = &bufPayload->buffer[offset]; + uint8_t eir_length = ndefBluetoothEirLength(eir); + + if (eir_length == 0U) + { + break; /* Leave when find an empty EIR */ + } + + offset += eir_length; + +#ifdef NDEF_BLUETOOTH_CHECK_REFERENCE_LENGTH + uint8_t eir_data_length = ndefBluetoothEirDataLength(eir); + uint8_t eir_type = ndefBluetoothEirType(eir); + uint32_t refLength = ndefBluetoothEirRefLength(eir_type); + /* Check length match */ + if ( (refLength != 0U) && + (refLength != eir_data_length) ) + { + return ERR_PROTO; + } +#endif + ndefStatus err = ndefBluetoothSetEir(ndefData, eir); + if (err != ERR_NONE) + { + return err; + } + } + + /* The client is in charge to check that the mandatory fields are there */ + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordToBluetooth(const ndefRecord* record, ndefType* type) +{ + const ndefType* ndefData; + ndefTypeId typeId; + + if ( (record == NULL) || (type == NULL) ) + { + return ERR_PARAM; + } + + /* "application/vnd.bluetooth.ep.oob" */ + if (ndefRecordTypeMatch(record, NDEF_TNF_MEDIA_TYPE, &bufMediaTypeBluetoothBrEdr)) + { + typeId = NDEF_TYPE_ID_BLUETOOTH_BREDR; + } + /* "application/vnd.bluetooth.le.oob" */ + else if (ndefRecordTypeMatch(record, NDEF_TNF_MEDIA_TYPE, &bufMediaTypeBluetoothLe)) + { + typeId = NDEF_TYPE_ID_BLUETOOTH_LE; + } + /* "application/vnd.bluetooth.secure.ep.oob" */ + else if (ndefRecordTypeMatch(record, NDEF_TNF_MEDIA_TYPE, &bufMediaTypeBluetoothSecureBrEdr)) + { + typeId = NDEF_TYPE_ID_BLUETOOTH_SECURE_BREDR; + } + /* "application/vnd.bluetooth.secure.le.oob" */ + else if (ndefRecordTypeMatch(record, NDEF_TNF_MEDIA_TYPE, &bufMediaTypeBluetoothSecureLe)) + { + typeId = NDEF_TYPE_ID_BLUETOOTH_SECURE_LE; + } + else + { + return ERR_PROTO; + } + + ndefData = ndefRecordGetNdefType(record); + if ( (ndefData != NULL) && ( (ndefData->id == NDEF_TYPE_ID_BLUETOOTH_BREDR) || + (ndefData->id == NDEF_TYPE_ID_BLUETOOTH_LE) || + (ndefData->id == NDEF_TYPE_ID_BLUETOOTH_SECURE_BREDR) || + (ndefData->id == NDEF_TYPE_ID_BLUETOOTH_SECURE_LE) ) + ) + { + (void)ST_MEMCPY(type, ndefData, sizeof(ndefType)); + return ERR_NONE; + } + + return ndefPayloadToBluetooth(&record->bufPayload, typeId, type); +} + + +/*****************************************************************************/ +ndefStatus ndefBluetoothToRecord(const ndefType* type, ndefRecord* record) +{ + if ( (type == NULL) || (record == NULL) ) + { + return ERR_PARAM; + } + + (void)ndefRecordReset(record); + + if (type->id == NDEF_TYPE_ID_BLUETOOTH_BREDR) + { + /* "application/vnd.bluetooth.ep.oob" */ + (void)ndefRecordSetType(record, NDEF_TNF_MEDIA_TYPE, &bufMediaTypeBluetoothBrEdr); + } + else if (type->id == NDEF_TYPE_ID_BLUETOOTH_LE) + { + /* "application/vnd.bluetooth.le.oob" */ + (void)ndefRecordSetType(record, NDEF_TNF_MEDIA_TYPE, &bufMediaTypeBluetoothLe); + } + else if (type->id == NDEF_TYPE_ID_BLUETOOTH_SECURE_BREDR) + { + /* "application/vnd.bluetooth.secure.ep.oob" */ + (void)ndefRecordSetType(record, NDEF_TNF_MEDIA_TYPE, &bufMediaTypeBluetoothSecureBrEdr); + } + else if (type->id == NDEF_TYPE_ID_BLUETOOTH_SECURE_LE) + { + /* "application/vnd.bluetooth.secure.le.oob" */ + (void)ndefRecordSetType(record, NDEF_TNF_MEDIA_TYPE, &bufMediaTypeBluetoothSecureLe); + } + else + { + return ERR_PROTO; + } + + if (ndefRecordSetNdefType(record, type) != ERR_NONE) + { + return ERR_PARAM; + } + + return ERR_NONE; +} + +#endif diff --git a/components/spi-st25r3911b/NDEF/source/message/ndef_type_deviceinfo.c b/components/spi-st25r3911b/NDEF/source/message/ndef_type_deviceinfo.c new file mode 100644 index 0000000..8f8f04a --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/message/ndef_type_deviceinfo.c @@ -0,0 +1,416 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF RTD Device Information type + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_types.h" +#include "ndef_type_deviceinfo.h" +#include "utils.h" + + +#if NDEF_TYPE_RTD_DEVICE_INFO_SUPPORT + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/*! Device Information payload defines */ +#define NDEF_RTD_DEVICE_INFO_PAYLOAD_MIN (2U * (sizeof(uint8_t) + sizeof(uint8_t) + sizeof(uint8_t))) /*!< Device Information minimum length (2 required TLV structures) */ +#define NDEF_RTD_DEVICE_INFO_PAYLOAD_MAX ((4U * (sizeof(uint8_t) + sizeof(uint8_t) + 255U)) + (sizeof(uint8_t) + sizeof(uint8_t) + 16U)) /*!< Device Information maximum length */ +#define NDEF_RTD_DEVICE_INFO_TLV_LENGTH_MIN (sizeof(uint8_t) + sizeof(uint8_t)) /*!< Device Information minimum TLV length */ + + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + + +/*! RTD Device Information Type string */ +static const uint8_t ndefRtdTypeDeviceInfo[] = "Di"; /*!< Device Information Record Type {0x44, 0x69} */ + +const ndefConstBuffer8 bufRtdTypeDeviceInfo = { ndefRtdTypeDeviceInfo, sizeof(ndefRtdTypeDeviceInfo) - 1U }; /*!< Device Information Record Type buffer */ + + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + + +/* + * Device Information + */ + + +/*****************************************************************************/ +static uint32_t ndefRtdDeviceInfoPayloadGetLength(const ndefType* devInfo) +{ + const ndefTypeRtdDeviceInfo* rtdDevInfo; + uint32_t payloadLength = 0; + + if ( (devInfo == NULL) || (devInfo->id != NDEF_TYPE_ID_RTD_DEVICE_INFO) ) + { + return 0; + } + + rtdDevInfo = &devInfo->data.deviceInfo; + + for (uint32_t i = 0; i < NDEF_DEVICE_INFO_TYPE_COUNT; i++) + { + if (rtdDevInfo->devInfo[i].length != 0U) + { + /* sizeof(type) + sizeof(length) + actual length */ + payloadLength += sizeof(rtdDevInfo->devInfo[i].type) + sizeof(rtdDevInfo->devInfo[i].length) + (uint32_t)rtdDevInfo->devInfo[i].length; + } + } + + return payloadLength; +} + + +/*****************************************************************************/ +static const uint8_t* ndefRtdDeviceInfoToPayloadItem(const ndefType* devInfo, ndefConstBuffer* bufItem, bool begin) +{ + static uint32_t item = 0; + const ndefTypeRtdDeviceInfo* rtdDevInfo; + uint32_t index; + + if ( (devInfo == NULL) || (devInfo->id != NDEF_TYPE_ID_RTD_DEVICE_INFO) || + (bufItem == NULL) ) + { + return NULL; + } + + rtdDevInfo = &devInfo->data.deviceInfo; + + if (begin == true) + { + item = 0; + } + + bufItem->buffer = NULL; + bufItem->length = 0; + + index = item / 3U; + + /* Stop streaming on first empty entry */ + if (rtdDevInfo->devInfo[index].length > 0U) + { + switch (item % 3U) + { + case 0: + bufItem->buffer = &rtdDevInfo->devInfo[index].type; + bufItem->length = sizeof(rtdDevInfo->devInfo[index].type); + break; + case 1: + bufItem->buffer = &rtdDevInfo->devInfo[index].length; + bufItem->length = sizeof(rtdDevInfo->devInfo[index].length); + break; + case 2: + bufItem->buffer = rtdDevInfo->devInfo[index].buffer; + bufItem->length = rtdDevInfo->devInfo[index].length; + break; + /*NOTREACHED*/ + default: + bufItem->buffer = NULL; + bufItem->length = 0; + break; + } + } + + /* Move to next item for next call */ + item++; + + return bufItem->buffer; +} + + +/*****************************************************************************/ +ndefStatus ndefRtdDeviceInfoInit(ndefType* devInfo, const ndefDeviceInfoEntry* devInfoData, uint8_t devInfoDataCount) +{ + ndefTypeRtdDeviceInfo* rtdDevInfo; + uint8_t count; + uint8_t manufacturerNameIndex; + uint8_t modelNameIndex; + + if ( (devInfo == NULL) || + (devInfoData == NULL) || (devInfoData->length == 0U) || + (devInfoDataCount == 0U) || (devInfoDataCount > NDEF_DEVICE_INFO_TYPE_COUNT) ) + { + return ERR_PARAM; + } + + devInfo->id = NDEF_TYPE_ID_RTD_DEVICE_INFO; + devInfo->getPayloadLength = ndefRtdDeviceInfoPayloadGetLength; + devInfo->getPayloadItem = ndefRtdDeviceInfoToPayloadItem; + devInfo->typeToRecord = ndefRtdDeviceInfoToRecord; + rtdDevInfo = &devInfo->data.deviceInfo; + + /* Clear the Device Information structure before parsing */ + for (uint32_t i = 0; i < NDEF_DEVICE_INFO_TYPE_COUNT; i++) + { + rtdDevInfo->devInfo[i].type = 0; + rtdDevInfo->devInfo[i].length = 0; + rtdDevInfo->devInfo[i].buffer = NULL; + } + + /* Read Type, Length and Value fields */ + /* Not checking multiple occurences of a given field, use the last one */ + count = 0; + manufacturerNameIndex = 0; + modelNameIndex = 0; + + while (count < devInfoDataCount) + { + uint8_t type = devInfoData[count].type; + uint8_t length = devInfoData[count].length; + if ((type == NDEF_DEVICE_INFO_UUID) && (length != NDEF_UUID_LENGTH)) + { + return ERR_PROTO; + } + if ( (type > NDEF_DEVICE_INFO_TYPE_COUNT) || (length == 0U) ) + { + return ERR_PROTO; + } + if (type == NDEF_DEVICE_INFO_MANUFACTURER_NAME) + { + manufacturerNameIndex = count; + } + else + { + if (type == NDEF_DEVICE_INFO_MODEL_NAME) + { + modelNameIndex = count; + } + } + + rtdDevInfo->devInfo[count].type = type; + rtdDevInfo->devInfo[count].length = length; + rtdDevInfo->devInfo[count].buffer = devInfoData[count].buffer; + count++; + } + + /* Check that both required fields are there */ + if ( (manufacturerNameIndex != modelNameIndex) && + (rtdDevInfo->devInfo[manufacturerNameIndex].buffer != NULL) && + (rtdDevInfo->devInfo[modelNameIndex].buffer != NULL) ) + { + return ERR_NONE; + } + else + { + return ERR_PARAM; + } +} + + +/*****************************************************************************/ +ndefStatus ndefGetRtdDeviceInfo(const ndefType* devInfo, ndefTypeRtdDeviceInfo* devInfoData) +{ + const ndefTypeRtdDeviceInfo* rtdDevInfo; + + if ( (devInfo == NULL) || (devInfo->id != NDEF_TYPE_ID_RTD_DEVICE_INFO) || + (devInfoData == NULL) ) + { + return ERR_PARAM; + } + + rtdDevInfo = &devInfo->data.deviceInfo; + + for (uint32_t i = 0; i < NDEF_DEVICE_INFO_TYPE_COUNT; i++) + { + devInfoData->devInfo[i].type = rtdDevInfo->devInfo[i].type; + devInfoData->devInfo[i].length = rtdDevInfo->devInfo[i].length; + devInfoData->devInfo[i].buffer = rtdDevInfo->devInfo[i].buffer; + } + + return ERR_NONE; +} + + +/*****************************************************************************/ +static ndefStatus ndefPayloadToRtdDeviceInfo(const ndefConstBuffer* bufDevInfo, ndefType* devInfo) +{ + ndefTypeRtdDeviceInfo* rtdDevInfo; + uint32_t offset; + uint8_t count; + uint8_t manufacturerNameIndex; + uint8_t modelNameIndex; + + if ( (bufDevInfo == NULL) || (bufDevInfo->buffer == NULL) || + (devInfo == NULL) ) + { + return ERR_PARAM; + } + + devInfo->id = NDEF_TYPE_ID_RTD_DEVICE_INFO; + devInfo->getPayloadLength = ndefRtdDeviceInfoPayloadGetLength; + devInfo->getPayloadItem = ndefRtdDeviceInfoToPayloadItem; + devInfo->typeToRecord = ndefRtdDeviceInfoToRecord; + rtdDevInfo = &devInfo->data.deviceInfo; + + if ( (bufDevInfo->length < NDEF_RTD_DEVICE_INFO_PAYLOAD_MIN) || + (bufDevInfo->length > NDEF_RTD_DEVICE_INFO_PAYLOAD_MAX) ) + { + return ERR_PROTO; + } + + /* Extract device information from the buffer */ + + /* Clear the Device Information structure before parsing */ + for (uint32_t i = 0; i < NDEF_DEVICE_INFO_TYPE_COUNT; i++) + { + rtdDevInfo->devInfo[i].type = 0; + rtdDevInfo->devInfo[i].length = 0; + rtdDevInfo->devInfo[i].buffer = NULL; + } + + /* Read Type, Length and Value fields */ + /* Not checking multiple occurences of a given field, use the last one */ + offset = 0; + count = 0; + manufacturerNameIndex = 0; + modelNameIndex = 0; + + while ( ((offset + NDEF_RTD_DEVICE_INFO_TLV_LENGTH_MIN) < bufDevInfo->length) + && (count < NDEF_DEVICE_INFO_TYPE_COUNT) ) + { + uint8_t type = bufDevInfo->buffer[offset]; + uint8_t length = bufDevInfo->buffer[offset + 1U]; + if ((type == NDEF_DEVICE_INFO_UUID) && (length != NDEF_UUID_LENGTH)) + { + return ERR_PROTO; + } + if ( (type > NDEF_DEVICE_INFO_TYPE_COUNT) || (length == 0U) ) + { + return ERR_PROTO; + } + if (type == NDEF_DEVICE_INFO_MANUFACTURER_NAME) + { + manufacturerNameIndex = count; + } + else + { + if (type == NDEF_DEVICE_INFO_MODEL_NAME) + { + modelNameIndex = count; + } + } + + rtdDevInfo->devInfo[count].type = type; + rtdDevInfo->devInfo[count].length = length; + rtdDevInfo->devInfo[count].buffer = &bufDevInfo->buffer[offset + 2U]; + count++; + + /* Next entry */ + offset += sizeof(uint8_t) + sizeof(uint8_t) + (uint32_t)length; + } + + /* Check both required fields are there */ + if ( (manufacturerNameIndex != modelNameIndex) && + (rtdDevInfo->devInfo[manufacturerNameIndex].buffer != NULL) && + (rtdDevInfo->devInfo[modelNameIndex].buffer != NULL) ) + { + return ERR_NONE; + } + else + { + return ERR_PARAM; + } +} + + +/*****************************************************************************/ +ndefStatus ndefRecordToRtdDeviceInfo(const ndefRecord* record, ndefType* devInfo) +{ + const ndefType* type; + + if ( (record == NULL) || (devInfo == NULL) ) + { + return ERR_PARAM; + } + + if ( ! ndefRecordTypeMatch(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufRtdTypeDeviceInfo)) /* "Di" */ + { + return ERR_PROTO; + } + + type = ndefRecordGetNdefType(record); + if ( (type != NULL) && (type->id == NDEF_TYPE_ID_RTD_DEVICE_INFO) ) + { + (void)ST_MEMCPY(devInfo, type, sizeof(ndefType)); + return ERR_NONE; + } + + return ndefPayloadToRtdDeviceInfo(&record->bufPayload, devInfo); +} + + +/*****************************************************************************/ +ndefStatus ndefRtdDeviceInfoToRecord(const ndefType* devInfo, ndefRecord* record) +{ + if ( (devInfo == NULL) || (devInfo->id != NDEF_TYPE_ID_RTD_DEVICE_INFO) || + (record == NULL) ) + { + return ERR_PARAM; + } + + (void)ndefRecordReset(record); + + /* "Di" */ + (void)ndefRecordSetType(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufRtdTypeDeviceInfo); + + if (ndefRecordSetNdefType(record, devInfo) != ERR_NONE) + { + return ERR_PARAM; + } + + return ERR_NONE; +} + +#endif diff --git a/components/spi-st25r3911b/NDEF/source/message/ndef_type_empty.c b/components/spi-st25r3911b/NDEF/source/message/ndef_type_empty.c new file mode 100644 index 0000000..66b79a0 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/message/ndef_type_empty.c @@ -0,0 +1,168 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2020 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF Empty type + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_types.h" +#include "ndef_type_empty.h" +#include "utils.h" + + +#if NDEF_TYPE_EMPTY_SUPPORT + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + + +/* + * Empty record + */ + + +/*****************************************************************************/ +static uint32_t ndefEmptyTypePayloadGetLength(const ndefType* empty) +{ + NO_WARNING(empty); + + return 0; +} + + +/*****************************************************************************/ +static const uint8_t* ndefEmptyTypePayloadItem(const ndefType* empty, ndefConstBuffer* bufItem, bool begin) +{ + NO_WARNING(begin); + + if ( (empty == NULL) || (empty->id != NDEF_TYPE_ID_EMPTY) ) + { + return NULL; + } + + if (bufItem != NULL) + { + bufItem->buffer = NULL; + bufItem->length = 0; + } + + return NULL; +} + + +/*****************************************************************************/ +ndefStatus ndefEmptyTypeInit(ndefType* empty) +{ + if (empty == NULL) + { + return ERR_PARAM; + } + + empty->id = NDEF_TYPE_ID_EMPTY; + empty->getPayloadLength = ndefEmptyTypePayloadGetLength; + empty->getPayloadItem = ndefEmptyTypePayloadItem; + empty->typeToRecord = ndefEmptyTypeToRecord; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordToEmptyType(const ndefRecord* record, ndefType* empty) +{ + ndefConstBuffer8 bufEmpty = { NULL, 0 }; + + if ( (record == NULL) || (empty == NULL) ) + { + return ERR_PARAM; + } + + if ( ! ndefRecordTypeMatch(record, NDEF_TNF_EMPTY, &bufEmpty)) + { + return ERR_PARAM; + } + + if ( (record->idLength != 0U) || (record->id != NULL) || + (record->bufPayload.length != 0U) || (record->bufPayload.buffer != NULL) ) + { + return ERR_PARAM; + } + + return ndefEmptyTypeInit(empty); +} + + +/*****************************************************************************/ +ndefStatus ndefEmptyTypeToRecord(const ndefType* empty, ndefRecord* record) +{ + if ( (empty == NULL) || (empty->id != NDEF_TYPE_ID_EMPTY) || + (record == NULL) ) + { + return ERR_PARAM; + } + + (void)ndefRecordReset(record); + + if (ndefRecordSetNdefType(record, empty) != ERR_NONE) + { + return ERR_PARAM; + } + + return ERR_NONE; +} + +#endif diff --git a/components/spi-st25r3911b/NDEF/source/message/ndef_type_flat.c b/components/spi-st25r3911b/NDEF/source/message/ndef_type_flat.c new file mode 100644 index 0000000..7a99110 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/message/ndef_type_flat.c @@ -0,0 +1,195 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2020 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF Empty type + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_types.h" +#include "ndef_type_flat.h" +#include "utils.h" + + +#if NDEF_TYPE_FLAT_SUPPORT + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + + +/* + * Flat payload record + */ + + +/*****************************************************************************/ +static uint32_t ndefFlatPayloadTypePayloadGetLength(const ndefType* type) +{ + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_FLAT) ) + { + return 0; + } + + return type->data.bufPayload.length; +} + + +/*****************************************************************************/ +static const uint8_t* ndefFlatPayloadTypePayloadItem(const ndefType* type, ndefConstBuffer* bufItem, bool begin) +{ + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_FLAT) ) + { + return NULL; + } + + if ( (begin == true) && (bufItem != NULL) ) + { + bufItem->buffer = type->data.bufPayload.buffer; + bufItem->length = type->data.bufPayload.length; + + return bufItem->buffer; + } + + return NULL; +} + + +/*****************************************************************************/ +ndefStatus ndefFlatPayloadTypeInit(ndefType* type, const ndefConstBuffer* bufPayload) +{ + if ( (type == NULL) || (bufPayload == NULL) ) + { + return ERR_PARAM; + } + + type->id = NDEF_TYPE_ID_FLAT; + type->getPayloadLength = ndefFlatPayloadTypePayloadGetLength; + type->getPayloadItem = ndefFlatPayloadTypePayloadItem; + type->typeToRecord = ndefFlatPayloadTypeToRecord; + + type->data.bufPayload.buffer = bufPayload->buffer; + type->data.bufPayload.length = bufPayload->length; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefGetFlatPayloadType(const ndefType* type, ndefConstBuffer* bufPayload) +{ + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_FLAT) || + (bufPayload == NULL) ) + { + return ERR_PARAM; + } + + bufPayload->buffer = type->data.bufPayload.buffer ; + bufPayload->length = type->data.bufPayload.length ; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordToFlatPayloadType(const ndefRecord* record, ndefType* type) +{ + const ndefType* ndefData; + + if ( (record == NULL) || (type == NULL) ) + { + return ERR_PARAM; + } + + ndefData = ndefRecordGetNdefType(record); + if ( (ndefData != NULL) && (ndefData->id == NDEF_TYPE_ID_FLAT) ) + { + (void)ST_MEMCPY(type, ndefData, sizeof(ndefType)); + return ERR_NONE; + } + + ndefConstBuffer bufPayload; + ndefStatus err = ndefRecordGetPayload(record, &bufPayload); + if (err != ERR_NONE) + { + return err; + } + + return ndefFlatPayloadTypeInit(type, &bufPayload); +} + + +/*****************************************************************************/ +ndefStatus ndefFlatPayloadTypeToRecord(const ndefType* type, ndefRecord* record) +{ + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_FLAT) || + (record == NULL) ) + { + return ERR_PARAM; + } + + (void)ndefRecordReset(record); + + /* Do not initialize Type string */ + + if (ndefRecordSetNdefType(record, type) != ERR_NONE) + { + return ERR_PARAM; + } + + return ERR_NONE; +} + +#endif diff --git a/components/spi-st25r3911b/NDEF/source/message/ndef_type_media.c b/components/spi-st25r3911b/NDEF/source/message/ndef_type_media.c new file mode 100644 index 0000000..651552e --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/message/ndef_type_media.c @@ -0,0 +1,178 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF MIME types + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_types.h" +#include "ndef_type_media.h" +#include "utils.h" + + +#if NDEF_TYPE_MEDIA_SUPPORT + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + + +/* + * Media + */ + + +/*****************************************************************************/ +ndefStatus ndefMediaInit(ndefType* media, const ndefConstBuffer8* bufType, const ndefConstBuffer* bufPayload) +{ + ndefTypeMedia* typeMedia; + + if ( (media == NULL) || (bufType == NULL) || (bufPayload == NULL) ) + { + return ERR_PARAM; + } + + media->id = NDEF_TYPE_ID_MEDIA; + media->getPayloadLength = NULL; + media->getPayloadItem = NULL; + media->typeToRecord = ndefMediaToRecord; + typeMedia = &media->data.media; + + typeMedia->bufType.buffer = bufType->buffer; + typeMedia->bufType.length = bufType->length; + typeMedia->bufPayload.buffer = bufPayload->buffer; + typeMedia->bufPayload.length = bufPayload->length; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefGetMedia(const ndefType* media, ndefConstBuffer8* bufType, ndefConstBuffer* bufPayload) +{ + const ndefTypeMedia* typeMedia; + + if ( (media == NULL) || (media->id != NDEF_TYPE_ID_MEDIA) || + (bufType == NULL) || (bufPayload == NULL) ) + { + return ERR_PARAM; + } + + typeMedia = &media->data.media; + + bufType->buffer = typeMedia->bufType.buffer; + bufType->length = typeMedia->bufType.length; + + bufPayload->buffer = typeMedia->bufPayload.buffer; + bufPayload->length = typeMedia->bufPayload.length; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordToMedia(const ndefRecord* record, ndefType* media) +{ + const ndefType* type; + ndefConstBuffer8 bufType; + + if ( (record == NULL) || (media == NULL) ) + { + return ERR_PARAM; + } + + if (ndefHeaderTNF(record) != NDEF_TNF_MEDIA_TYPE) + { + return ERR_PROTO; + } + + type = ndefRecordGetNdefType(record); + if ( (type != NULL) && (type->id == NDEF_TYPE_ID_MEDIA) ) + { + (void)ST_MEMCPY(media, type, sizeof(ndefType)); + return ERR_NONE; + } + + bufType.buffer = record->type; + bufType.length = record->typeLength; + + return ndefMediaInit(media, &bufType, &record->bufPayload); +} + + +/*****************************************************************************/ +ndefStatus ndefMediaToRecord(const ndefType* media, ndefRecord* record) +{ + const ndefTypeMedia* typeMedia; + + if ( (media == NULL) || (media->id != NDEF_TYPE_ID_MEDIA) || + (record == NULL) ) + { + return ERR_PARAM; + } + + typeMedia = &media->data.media; + + (void)ndefRecordReset(record); + + (void)ndefRecordSetType(record, NDEF_TNF_MEDIA_TYPE, &typeMedia->bufType); + + (void)ndefRecordSetPayload(record, &typeMedia->bufPayload); + + return ERR_NONE; +} + +#endif diff --git a/components/spi-st25r3911b/NDEF/source/message/ndef_type_text.c b/components/spi-st25r3911b/NDEF/source/message/ndef_type_text.c new file mode 100644 index 0000000..211b0c3 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/message/ndef_type_text.c @@ -0,0 +1,317 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF RTD Text type + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_types.h" +#include "ndef_type_text.h" +#include "utils.h" + + +#if NDEF_TYPE_RTD_TEXT_SUPPORT + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/*! Text defines */ +#define NDEF_RTD_TEXT_STATUS_OFFSET 0U /*!< Text status offset */ +#define NDEF_RTD_TEXT_LANGUAGE_OFFSET 1U /*!< Text language offset */ + +#define NDEF_RTD_TEXT_LANGUAGE_CODE_LEN_MASK 0x3FU /*!< IANA language code mask (length coded on 6 bits) */ + +#define NDEF_RTD_TEXT_PAYLOAD_LENGTH_MIN (sizeof(uint8_t) + sizeof(uint8_t)) /*!< Minimum Text Payload length */ + + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + + +/*! RTD Text Type string */ +static const uint8_t ndefRtdTypeText[] = "T"; /*!< Text Record Type {0x54} */ + +const ndefConstBuffer8 bufRtdTypeText = { ndefRtdTypeText, sizeof(ndefRtdTypeText) - 1U }; /*!< Text Record Type buffer */ + + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + + +/* + * Text + */ + + +/*****************************************************************************/ +static uint32_t ndefRtdTextPayloadGetLength(const ndefType* text) +{ + const ndefTypeRtdText* rtdText; + + if ( (text == NULL) || (text->id != NDEF_TYPE_ID_RTD_TEXT) ) + { + return 0; + } + + rtdText = &text->data.text; + + return sizeof(rtdText->status) + rtdText->bufLanguageCode.length + rtdText->bufSentence.length; +} + + +/*****************************************************************************/ +static const uint8_t* ndefRtdTextToPayloadItem(const ndefType* text, ndefConstBuffer* bufItem, bool begin) +{ + static uint32_t item = 0; + const ndefTypeRtdText* rtdText; + + if ( (text == NULL) || (text->id != NDEF_TYPE_ID_RTD_TEXT) || + (bufItem == NULL) ) + { + return NULL; + } + + rtdText = &text->data.text; + + if (begin == true) + { + item = 0; + } + + switch (item) + { + case 0: + /* Status byte */ + bufItem->buffer = &rtdText->status; + bufItem->length = sizeof(rtdText->status); + break; + + case 1: + /* Language Code */ + bufItem->buffer = rtdText->bufLanguageCode.buffer; + bufItem->length = rtdText->bufLanguageCode.length; + break; + + case 2: + /* Actual text */ + bufItem->buffer = rtdText->bufSentence.buffer; + bufItem->length = rtdText->bufSentence.length; + break; + + default: + bufItem->buffer = NULL; + bufItem->length = 0; + break; + } + + /* Move to next item for next call */ + item++; + + return bufItem->buffer; +} + + +/*****************************************************************************/ +ndefStatus ndefRtdTextInit(ndefType* text, uint8_t utfEncoding, const ndefConstBuffer8* bufLanguageCode, const ndefConstBuffer* bufSentence) +{ + ndefTypeRtdText* rtdText; + + if ( (text == NULL) || + (bufLanguageCode == NULL) || (bufLanguageCode->buffer == NULL) || (bufLanguageCode->length == 0U) || + (bufSentence == NULL) || (bufSentence->buffer == NULL) || (bufSentence->length == 0U) ) + { + return ERR_PARAM; + } + + if (bufLanguageCode->length > NDEF_RTD_TEXT_LANGUAGE_CODE_LEN_MASK) + { + return ERR_PROTO; + } + + if ( (utfEncoding != TEXT_ENCODING_UTF8) && (utfEncoding != TEXT_ENCODING_UTF16) ) + { + return ERR_PARAM; + } + + text->id = NDEF_TYPE_ID_RTD_TEXT; + text->getPayloadLength = ndefRtdTextPayloadGetLength; + text->getPayloadItem = ndefRtdTextToPayloadItem; + text->typeToRecord = ndefRtdTextToRecord; + rtdText = &text->data.text; + + rtdText->status = (utfEncoding << NDEF_TEXT_ENCODING_SHIFT) | (bufLanguageCode->length & NDEF_RTD_TEXT_LANGUAGE_CODE_LEN_MASK); + + rtdText->bufLanguageCode.buffer = bufLanguageCode->buffer; + rtdText->bufLanguageCode.length = bufLanguageCode->length; + + rtdText->bufSentence.buffer = bufSentence->buffer; + rtdText->bufSentence.length = bufSentence->length; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefGetRtdText(const ndefType* text, uint8_t* utfEncoding, ndefConstBuffer8* bufLanguageCode, ndefConstBuffer* bufSentence) +{ + const ndefTypeRtdText* rtdText; + + if ( (text == NULL) || (text->id != NDEF_TYPE_ID_RTD_TEXT) || + (utfEncoding == NULL) || (bufLanguageCode == NULL) || (bufSentence == NULL) ) + { + return ERR_PARAM; + } + + rtdText = &text->data.text; + + *utfEncoding = (rtdText->status >> NDEF_TEXT_ENCODING_SHIFT) & 1U; + + bufLanguageCode->buffer = rtdText->bufLanguageCode.buffer; + bufLanguageCode->length = rtdText->bufLanguageCode.length; + + bufSentence->buffer = rtdText->bufSentence.buffer; + bufSentence->length = rtdText->bufSentence.length; + + return ERR_NONE; +} + + +/*****************************************************************************/ +static ndefStatus ndefPayloadToRtdText(const ndefConstBuffer* bufText, ndefType* text) +{ + ndefTypeRtdText* rtdText; + uint8_t status; + uint8_t languageCodeLength; + + if ( (bufText == NULL) || (bufText->buffer == NULL) || (bufText->length == 0U) || + (text == NULL) ) + { + return ERR_PARAM; + } + + if (bufText->length < NDEF_RTD_TEXT_PAYLOAD_LENGTH_MIN) /* Text Payload Min */ + { + return ERR_PROTO; + } + + text->id = NDEF_TYPE_ID_RTD_TEXT; + text->getPayloadLength = ndefRtdTextPayloadGetLength; + text->getPayloadItem = ndefRtdTextToPayloadItem; + text->typeToRecord = ndefRtdTextToRecord; + rtdText = &text->data.text; + + /* Extract info from the payload */ + status = bufText->buffer[NDEF_RTD_TEXT_STATUS_OFFSET]; + + rtdText->status = status; + + /* Extract info from the status byte */ + //uint8_t textUtfEncoding = (status & NDEF_TEXT_ENCODING_MASK) >> NDEF_TEXT_ENCODING_SHIFT; + languageCodeLength = (status & NDEF_RTD_TEXT_LANGUAGE_CODE_LEN_MASK); + + rtdText->bufLanguageCode.buffer = &(bufText->buffer[NDEF_RTD_TEXT_LANGUAGE_OFFSET]); + rtdText->bufLanguageCode.length = languageCodeLength; + + rtdText->bufSentence.buffer = &(bufText->buffer[NDEF_RTD_TEXT_LANGUAGE_OFFSET + languageCodeLength]); + rtdText->bufSentence.length = bufText->length - sizeof(status) - languageCodeLength; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordToRtdText(const ndefRecord* record, ndefType* text) +{ + const ndefType* type; + + if ( (record == NULL) || (text == NULL) ) + { + return ERR_PARAM; + } + + if ( ! ndefRecordTypeMatch(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufRtdTypeText)) /* "T" */ + { + return ERR_PROTO; + } + + type = ndefRecordGetNdefType(record); + if ( (type != NULL) && (type->id == NDEF_TYPE_ID_RTD_TEXT) ) + { + (void)ST_MEMCPY(text, type, sizeof(ndefType)); + return ERR_NONE; + } + + return ndefPayloadToRtdText(&record->bufPayload, text); +} + + +/*****************************************************************************/ +ndefStatus ndefRtdTextToRecord(const ndefType* text, ndefRecord* record) +{ + if ( (text == NULL) || (text->id != NDEF_TYPE_ID_RTD_TEXT) || + (record == NULL) ) + { + return ERR_PARAM; + } + + (void)ndefRecordReset(record); + + /* "T" */ + (void)ndefRecordSetType(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufRtdTypeText); + + if (ndefRecordSetNdefType(record, text) != ERR_NONE) + { + return ERR_PARAM; + } + + return ERR_NONE; +} + +#endif diff --git a/components/spi-st25r3911b/NDEF/source/message/ndef_type_tnep.c b/components/spi-st25r3911b/NDEF/source/message/ndef_type_tnep.c new file mode 100644 index 0000000..90f9992 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/message/ndef_type_tnep.c @@ -0,0 +1,711 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF TNEP (Tag NDEF Exchange Protocol record) types + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include +#include "ndef_record.h" +#include "ndef_types.h" +#include "ndef_type_tnep.h" +#include "utils.h" + + +#if NDEF_TYPE_RTD_TNEP_SUPPORT + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/*! TNEP defines */ +#define NDEF_TNEP_SERVICE_NAME_URI_LENGTH_LENGTH sizeof(uint8_t) /*!< Service Name URI length's length */ + +/*! TNEP Service Parameter defines */ +#define NDEF_RTD_TNEP_SP_VERSION_OFFSET 0U /*!< TNEP Service Parameter TNEP Version offset */ +#define NDEF_RTD_TNEP_SP_SERVICE_URI_LENGTH_OFFSET 1U /*!< TNEP Service Parameter URI length offset */ +#define NDEF_RTD_TNEP_SP_SERVICE_URI_OFFSET 2U /*!< TNEP Service Parameter URI offset */ +#define NDEF_RTD_TNEP_SP_SERVICE_URI_LENGTH_MAX 255U /*!< TNEP Service Parameter URI max length (bytes) */ +#define NDEF_RTD_TNEP_SP_COMMUNICATION_MODE_OFFSET 2U /*!< TNEP Service Parameter Communication Mode offset */ +#define NDEF_RTD_TNEP_SP_MIN_WAITING_TIME_OFFSET 3U /*!< TNEP Service Parameter Minimum Waiting Time offset */ +#define NDEF_RTD_TNEP_SP_MAX_WT_EXTENSIONS_OFFSET 4U /*!< TNEP Service Parameter Maximum Waiting Time Extensions offset */ +#define NDEF_RTD_TNEP_SP_MAX_MESSAGE_SIZE_OFFSET 5U /*!< TNEP Service Parameter Maximum NDEF Message Size (bytes) offset */ +#define NDEF_RTD_TNEP_SP_MINIMUM_LENGTH 8U /*!< TNEP Service Parameter minimum length (bytes) */ + +/*! TNEP Service Select defines */ +#define NDEF_RTD_TNEP_SS_SERVICE_URI_LENGTH_OFFSET 0U /*!< TNEP Service Select URI length offset */ +#define NDEF_RTD_TNEP_SS_SERVICE_URI_OFFSET 1U /*!< TNEP Service Select URI offset */ +#define NDEF_RTD_TNEP_SS_MINIMUM_LENGTH 2U /*!< TNEP Service Select minimum length (bytes) */ + +/*! TNEP Service Select defines */ +#define NDEF_RTD_TNEP_STATUS_TYPE_OFFSET 0U /*!< TNEP Status Type offset */ +#define NDEF_RTD_TNEP_STATUS_MINIMUM_LENGTH 1U /*!< TNEP Status minimum length (bytes) */ + + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + + +/*! RTD TNEP Type strings */ +static const uint8_t ndefRtdTypeTnepServiceParameter[] = "Tp"; /*!< Tnep Service Parameter Record Type */ +static const uint8_t ndefRtdTypeTnepServiceSelect[] = "Ts"; /*!< Tnep Service Select Record Type */ +static const uint8_t ndefRtdTypeTnepStatus[] = "Te"; /*!< Tnep Status Record Type */ + +const ndefConstBuffer8 bufRtdTypeTnepServiceParameter = { ndefRtdTypeTnepServiceParameter, sizeof(ndefRtdTypeTnepServiceParameter) - 1U }; /*!< TNEP Service Parameter Type Record buffer */ +const ndefConstBuffer8 bufRtdTypeTnepServiceSelect = { ndefRtdTypeTnepServiceSelect, sizeof(ndefRtdTypeTnepServiceSelect) - 1U }; /*!< TNEP Service Select Type Record buffer */ +const ndefConstBuffer8 bufRtdTypeTnepStatus = { ndefRtdTypeTnepStatus, sizeof(ndefRtdTypeTnepStatus) - 1U }; /*!< TNEP Status Type Record buffer */ + + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + + +/* + * TNEP Service Parameter + */ + +/*****************************************************************************/ +static uint32_t ndefRtdTnepServiceParameterGetPayloadLength(const ndefType* type) +{ + const ndefTypeRtdTnepServiceParameter* rtdServiceParameter; + + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_TNEP_SERVICE_PARAMETER) ) + { + return 0; + } + + rtdServiceParameter = &type->data.tnepServiceParameter; + + return sizeof(rtdServiceParameter->tnepVersion) + + NDEF_TNEP_SERVICE_NAME_URI_LENGTH_LENGTH + + rtdServiceParameter->bufServiceNameUri.length + + sizeof(rtdServiceParameter->communicationMode) + + sizeof(rtdServiceParameter->minimumWaitingTime) + + sizeof(rtdServiceParameter->maximumWaitingTimeExtensions) + + sizeof(rtdServiceParameter->maximumNdefMessageSize); +} + + +/*****************************************************************************/ +static const uint8_t* ndefRtdTnepServiceParameterToPayloadItem(const ndefType* type, ndefConstBuffer* bufItem, bool begin) +{ + static uint32_t item = 0; + const ndefTypeRtdTnepServiceParameter* rtdServiceParameter; + + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_TNEP_SERVICE_PARAMETER) + || (bufItem == NULL) ) + { + return NULL; + } + + rtdServiceParameter = &type->data.tnepServiceParameter; + + if (begin == true) + { + item = 0; + } + + switch (item) + { + case 0: + /* TNEP version byte */ + bufItem->buffer = &rtdServiceParameter->tnepVersion; + bufItem->length = sizeof(rtdServiceParameter->tnepVersion); + break; + + case 1: + /* Service URI length byte */ + bufItem->buffer = (const uint8_t*)&(rtdServiceParameter->bufServiceNameUri.length); + bufItem->length = NDEF_TNEP_SERVICE_NAME_URI_LENGTH_LENGTH; + break; + + case 2: + /* Service URI string */ + bufItem->buffer = rtdServiceParameter->bufServiceNameUri.buffer; + bufItem->length = rtdServiceParameter->bufServiceNameUri.length; + break; + + case 3: + /* TNEP communication Mode byte */ + bufItem->buffer = &rtdServiceParameter->communicationMode; + bufItem->length = sizeof(rtdServiceParameter->communicationMode); + break; + + case 4: + /* Minimum waiting time byte */ + bufItem->buffer = &rtdServiceParameter->minimumWaitingTime; + bufItem->length = sizeof(rtdServiceParameter->minimumWaitingTime); + break; + + case 5: + /* Maximum waiting time extensions byte */ + bufItem->buffer = &rtdServiceParameter->maximumWaitingTimeExtensions; + bufItem->length = sizeof(rtdServiceParameter->maximumWaitingTimeExtensions); + break; + + case 6: + /* Maximum NDEF message size */ + bufItem->buffer = rtdServiceParameter->maximumNdefMessageSize; + bufItem->length = sizeof(rtdServiceParameter->maximumNdefMessageSize); + break; + + default: + bufItem->buffer = NULL; + bufItem->length = 0; + break; + } + + /* Move to next item for next call */ + item++; + + return bufItem->buffer; +} + + +#ifdef NDEF_PROVIDE_HELPER_FUNCTIONS +/*****************************************************************************/ +uint8_t ndefRtdTnepServiceParameterComputeWtInt(float twait) +{ + return ceil(4 * ((log(twait)/0.69314) + 1)); +} + + +/*****************************************************************************/ +float ndefRtdTnepServiceParameterComputeTwait(uint8_t wtInt) +{ + return powf(2, (((float)wtInt/4) - 1)); +} +#endif + + +/*****************************************************************************/ +ndefStatus ndefRtdTnepServiceParameterInit(ndefType* type, uint8_t tnepVersion, const ndefConstBuffer* bufServiceUri, uint8_t comMode, uint8_t minWaitingTime, uint8_t maxExtensions, uint16_t maxMessageSize) +{ + ndefTypeRtdTnepServiceParameter* rtdServiceParameter; + + if ( (type == NULL) || (bufServiceUri == NULL) + || (bufServiceUri->buffer == NULL) || (bufServiceUri->length == 0U) + || (bufServiceUri->length > (NDEF_RTD_TNEP_SP_SERVICE_URI_LENGTH_MAX)) ) + { + return ERR_PARAM; + } + + type->id = NDEF_TYPE_ID_RTD_TNEP_SERVICE_PARAMETER; + type->getPayloadLength = ndefRtdTnepServiceParameterGetPayloadLength; + type->getPayloadItem = ndefRtdTnepServiceParameterToPayloadItem; + type->typeToRecord = ndefRtdTnepServiceParameterToRecord; + rtdServiceParameter = &type->data.tnepServiceParameter; + + rtdServiceParameter->tnepVersion = tnepVersion; + rtdServiceParameter->bufServiceNameUri.length = bufServiceUri->length; + rtdServiceParameter->bufServiceNameUri.buffer = bufServiceUri->buffer; + rtdServiceParameter->communicationMode = comMode; + rtdServiceParameter->minimumWaitingTime = minWaitingTime; + rtdServiceParameter->maximumWaitingTimeExtensions = maxExtensions; + rtdServiceParameter->maximumNdefMessageSize[0] = (uint8_t)(maxMessageSize >> 8U); + rtdServiceParameter->maximumNdefMessageSize[1] = (uint8_t)(maxMessageSize & 0xFFU); + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefGetRtdTnepServiceParameter(const ndefType* type, uint8_t* tnepVersion, ndefConstBuffer* bufServiceUri, uint8_t* comMode, uint8_t* minWaitingTime, uint8_t* maxExtensions, uint16_t* maxMessageSize) +{ + const ndefTypeRtdTnepServiceParameter* rtdServiceParameter; + + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_TNEP_SERVICE_PARAMETER) + || (bufServiceUri == NULL) || (tnepVersion == NULL) || (comMode == NULL) + || (minWaitingTime == NULL) || (maxExtensions == NULL) || (maxMessageSize == NULL) ) + { + return ERR_PARAM; + } + + rtdServiceParameter = &type->data.tnepServiceParameter; + + *tnepVersion = rtdServiceParameter->tnepVersion; + bufServiceUri->buffer = rtdServiceParameter->bufServiceNameUri.buffer; + bufServiceUri->length = rtdServiceParameter->bufServiceNameUri.length; + *comMode = rtdServiceParameter->communicationMode; + *minWaitingTime = rtdServiceParameter->minimumWaitingTime; + *maxExtensions = rtdServiceParameter->maximumWaitingTimeExtensions; + *maxMessageSize = GETU16(rtdServiceParameter->maximumNdefMessageSize); + + return ERR_NONE; +} + + +/*****************************************************************************/ +static ndefStatus ndefPayloadToRtdTnepServiceParameter(const ndefConstBuffer* bufTnepServiceParameter, ndefType* type) +{ + uint8_t tnepVersion; + ndefConstBuffer bufServiceUri; + uint8_t commMode; + uint8_t minWaitingTime; + uint8_t maxWaitingTimeExtensions; + uint16_t maxNdefMessageSize; + uint32_t maxNdefMessageSizeOffset; + + if ( (bufTnepServiceParameter == NULL) || (bufTnepServiceParameter->buffer == NULL) || (bufTnepServiceParameter->length < (NDEF_RTD_TNEP_SP_MINIMUM_LENGTH)) || + (type == NULL)) + { + return ERR_PARAM; + } + + /* Extract info from the payload */ + tnepVersion = bufTnepServiceParameter->buffer[NDEF_RTD_TNEP_SP_VERSION_OFFSET]; + bufServiceUri.buffer = &bufTnepServiceParameter->buffer[NDEF_RTD_TNEP_SP_SERVICE_URI_OFFSET]; + bufServiceUri.length = bufTnepServiceParameter->buffer[NDEF_RTD_TNEP_SP_SERVICE_URI_LENGTH_OFFSET]; + commMode = bufTnepServiceParameter->buffer[NDEF_RTD_TNEP_SP_COMMUNICATION_MODE_OFFSET + bufServiceUri.length]; + minWaitingTime = bufTnepServiceParameter->buffer[NDEF_RTD_TNEP_SP_MIN_WAITING_TIME_OFFSET + bufServiceUri.length]; + maxWaitingTimeExtensions = bufTnepServiceParameter->buffer[NDEF_RTD_TNEP_SP_MAX_WT_EXTENSIONS_OFFSET + bufServiceUri.length]; + maxNdefMessageSizeOffset = NDEF_RTD_TNEP_SP_MAX_MESSAGE_SIZE_OFFSET + bufServiceUri.length; + maxNdefMessageSize = GETU16(&bufTnepServiceParameter->buffer[maxNdefMessageSizeOffset]); + + return ndefRtdTnepServiceParameterInit(type, tnepVersion, &bufServiceUri, commMode, minWaitingTime, maxWaitingTimeExtensions, maxNdefMessageSize); +} + + +/*****************************************************************************/ +ndefStatus ndefRecordToRtdTnepServiceParameter(const ndefRecord* record, ndefType* type) +{ + const ndefType* ndefData; + + if ( (record == NULL) || (type == NULL) ) + { + return ERR_PARAM; + } + + if ( ! ndefRecordTypeMatch(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufRtdTypeTnepServiceParameter)) /* "Tp" */ + { + return ERR_PROTO; + } + + ndefData = ndefRecordGetNdefType(record); + if ( (ndefData != NULL) && (ndefData->id == NDEF_TYPE_ID_RTD_TNEP_SERVICE_PARAMETER) ) + { + (void)ST_MEMCPY(type, ndefData, sizeof(ndefType)); + return ERR_NONE; + } + + if (record->bufPayload.length < NDEF_RTD_TNEP_SP_MINIMUM_LENGTH) + { + return ERR_PROTO; + } + + return ndefPayloadToRtdTnepServiceParameter(&record->bufPayload, type); +} + + +/*****************************************************************************/ +ndefStatus ndefRtdTnepServiceParameterToRecord(const ndefType* type, ndefRecord* record) +{ + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_TNEP_SERVICE_PARAMETER) || + (record == NULL) ) + { + return ERR_PARAM; + } + + (void)ndefRecordReset(record); + + /* "Tp" */ + (void)ndefRecordSetType(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufRtdTypeTnepServiceParameter); + + (void)ndefRecordSetNdefType(record, type); + + return ERR_NONE; +} + + +/* + * TNEP Service Select + */ + + +/*****************************************************************************/ +static uint32_t ndefRtdTnepServiceSelectGetPayloadLength(const ndefType* type) +{ + const ndefTypeRtdTnepServiceSelect* rtdServiceSelect; + + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_TNEP_SERVICE_SELECT) ) + { + return 0; + } + + rtdServiceSelect = &type->data.tnepServiceSelect; + + return NDEF_TNEP_SERVICE_NAME_URI_LENGTH_LENGTH + rtdServiceSelect->bufServiceNameUri.length; +} + + +/*****************************************************************************/ +static const uint8_t* ndefRtdTnepServiceSelectToPayloadItem(const ndefType* type, ndefConstBuffer* bufItem, bool begin) +{ + static uint32_t item = 0; + const ndefTypeRtdTnepServiceSelect* rtdServiceSelect; + + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_TNEP_SERVICE_SELECT) + || (bufItem == NULL) ) + { + return NULL; + } + + rtdServiceSelect = &type->data.tnepServiceSelect; + + if (begin == true) + { + item = 0; + } + + switch (item) + { + case 0: + /* Service URI length byte */ + bufItem->buffer = (const uint8_t*)&rtdServiceSelect->bufServiceNameUri.length; + bufItem->length = NDEF_TNEP_SERVICE_NAME_URI_LENGTH_LENGTH; + break; + + case 1: + /* Service URI string */ + bufItem->buffer = rtdServiceSelect->bufServiceNameUri.buffer; + bufItem->length = rtdServiceSelect->bufServiceNameUri.length; + break; + + default: + bufItem->buffer = NULL; + bufItem->length = 0; + break; + } + + /* Move to next item for next call */ + item++; + + return bufItem->buffer; +} + + +/*****************************************************************************/ +ndefStatus ndefRtdTnepServiceSelectInit(ndefType* type, const ndefConstBuffer* bufServiceUri) +{ + ndefTypeRtdTnepServiceSelect* rtdServiceSelect; + + if ( (type == NULL) || (bufServiceUri == NULL) + || (bufServiceUri->buffer == NULL) || (bufServiceUri->length == 0U) + || (bufServiceUri->length > (NDEF_RTD_TNEP_SP_SERVICE_URI_LENGTH_MAX))) + { + return ERR_PARAM; + } + + type->id = NDEF_TYPE_ID_RTD_TNEP_SERVICE_SELECT; + type->getPayloadLength = ndefRtdTnepServiceSelectGetPayloadLength; + type->getPayloadItem = ndefRtdTnepServiceSelectToPayloadItem; + type->typeToRecord = ndefRtdTnepServiceSelectToRecord; + rtdServiceSelect = &type->data.tnepServiceSelect; + + rtdServiceSelect->bufServiceNameUri.length = bufServiceUri->length; + rtdServiceSelect->bufServiceNameUri.buffer = bufServiceUri->buffer; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefGetRtdTnepServiceSelect(const ndefType* type, ndefConstBuffer* bufServiceUri) +{ + const ndefTypeRtdTnepServiceSelect* rtdServiceSelect; + + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_TNEP_SERVICE_SELECT) || + (bufServiceUri == NULL) ) + { + return ERR_PARAM; + } + + rtdServiceSelect = &type->data.tnepServiceSelect; + + bufServiceUri->buffer = rtdServiceSelect->bufServiceNameUri.buffer; + bufServiceUri->length = rtdServiceSelect->bufServiceNameUri.length; + + return ERR_NONE; +} + + +/*****************************************************************************/ +static ndefStatus ndefPayloadToRtdTnepServiceSelect(const ndefConstBuffer* bufTnepServiceSelect, ndefType* type) +{ + ndefConstBuffer bufServiceUri; + + if ( (bufTnepServiceSelect == NULL) || (bufTnepServiceSelect->buffer == NULL) || (bufTnepServiceSelect->length < (NDEF_RTD_TNEP_SS_MINIMUM_LENGTH)) || + (type == NULL)) + { + return ERR_PARAM; + } + + /* Extract info from the payload */ + bufServiceUri.buffer = &bufTnepServiceSelect->buffer[NDEF_RTD_TNEP_SS_SERVICE_URI_OFFSET]; + bufServiceUri.length = bufTnepServiceSelect->buffer[NDEF_RTD_TNEP_SS_SERVICE_URI_LENGTH_OFFSET]; + + return ndefRtdTnepServiceSelectInit(type, &bufServiceUri); +} + + +/*****************************************************************************/ +ndefStatus ndefRecordToRtdTnepServiceSelect(const ndefRecord* record, ndefType* type) +{ + const ndefType* ndefData; + + if ( (record == NULL) || (type == NULL) ) + { + return ERR_PARAM; + } + + if ( ! ndefRecordTypeMatch(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufRtdTypeTnepServiceSelect)) /* "Ts" */ + { + return ERR_PROTO; + } + + ndefData = ndefRecordGetNdefType(record); + if ( (ndefData != NULL) && (ndefData->id == NDEF_TYPE_ID_RTD_TNEP_SERVICE_SELECT) ) + { + (void)ST_MEMCPY(type, ndefData, sizeof(ndefType)); + return ERR_NONE; + } + + if (record->bufPayload.length < NDEF_RTD_TNEP_SS_MINIMUM_LENGTH) + { + return ERR_PROTO; + } + + return ndefPayloadToRtdTnepServiceSelect(&record->bufPayload, type); +} + + +/*****************************************************************************/ +ndefStatus ndefRtdTnepServiceSelectToRecord(const ndefType* type, ndefRecord* record) +{ + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_TNEP_SERVICE_SELECT) || + (record == NULL) ) + { + return ERR_PARAM; + } + + (void)ndefRecordReset(record); + + /* "Ts" */ + (void)ndefRecordSetType(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufRtdTypeTnepServiceSelect); + + (void)ndefRecordSetNdefType(record, type); + + return ERR_NONE; +} + + +/* + * TNEP Status + */ + + +/*****************************************************************************/ +static uint32_t ndefRtdTnepStatusGetPayloadLength(const ndefType* type) +{ + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_TNEP_STATUS) ) + { + return 0; + } + + return sizeof(type->data.tnepStatus.statusType); +} + + +/*****************************************************************************/ +static const uint8_t* ndefRtdTnepStatusToPayloadItem(const ndefType* type, ndefConstBuffer* bufItem, bool begin) +{ + static uint32_t item = 0; + const ndefTypeRtdTnepStatus* rtdStatus; + + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_TNEP_STATUS) + || (bufItem == NULL) ) + { + return NULL; + } + + rtdStatus = &type->data.tnepStatus; + + if (begin == true) + { + item = 0; + } + + switch (item) + { + case 0: + /* Status type byte */ + bufItem->buffer = &rtdStatus->statusType; + bufItem->length = sizeof(rtdStatus->statusType); + break; + default: + bufItem->buffer = NULL; + bufItem->length = 0; + break; + } + + /* Move to next item for next call */ + item++; + + return bufItem->buffer; +} + + +/*****************************************************************************/ +ndefStatus ndefRtdTnepStatusInit(ndefType* type, uint8_t statusType) +{ + ndefTypeRtdTnepStatus* rtdStatus; + + if (type == NULL) + { + return ERR_PARAM; + } + + type->id = NDEF_TYPE_ID_RTD_TNEP_STATUS; + type->getPayloadLength = ndefRtdTnepStatusGetPayloadLength; + type->getPayloadItem = ndefRtdTnepStatusToPayloadItem; + type->typeToRecord = ndefRtdTnepStatusToRecord; + rtdStatus = &type->data.tnepStatus; + + rtdStatus->statusType = statusType; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefGetRtdTnepStatus(const ndefType* type, uint8_t* statusType) +{ + const ndefTypeRtdTnepStatus* rtdStatus; + + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_TNEP_STATUS) || + (statusType == NULL) ) + { + return ERR_PARAM; + } + + rtdStatus = &type->data.tnepStatus; + + *statusType = rtdStatus->statusType; + + return ERR_NONE; +} + + +/*****************************************************************************/ +static ndefStatus ndefPayloadToRtdTnepStatus(const ndefConstBuffer* bufTnepStatus, ndefType* type) +{ + uint8_t statusType; + + if ( (bufTnepStatus == NULL) || (bufTnepStatus->buffer == NULL) || (bufTnepStatus->length < (NDEF_RTD_TNEP_STATUS_MINIMUM_LENGTH)) || + (type == NULL)) + { + return ERR_PARAM; + } + + /* Extract info from the payload */ + statusType = bufTnepStatus->buffer[NDEF_RTD_TNEP_STATUS_TYPE_OFFSET]; + + return ndefRtdTnepStatusInit(type, statusType); +} + + +/*****************************************************************************/ +ndefStatus ndefRecordToRtdTnepStatus(const ndefRecord* record, ndefType* type) +{ + const ndefType* ndefData; + + if ( (record == NULL) || (type == NULL) ) + { + return ERR_PARAM; + } + + if ( ! ndefRecordTypeMatch(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufRtdTypeTnepStatus)) /* "Te" */ + { + return ERR_PROTO; + } + + ndefData = ndefRecordGetNdefType(record); + if ( (ndefData != NULL) && (ndefData->id == NDEF_TYPE_ID_RTD_TNEP_STATUS) ) + { + (void)ST_MEMCPY(type, ndefData, sizeof(ndefType)); + return ERR_NONE; + } + + if (record->bufPayload.length < NDEF_RTD_TNEP_STATUS_MINIMUM_LENGTH) + { + return ERR_PROTO; + } + + return ndefPayloadToRtdTnepStatus(&record->bufPayload, type); +} + + +/*****************************************************************************/ +ndefStatus ndefRtdTnepStatusToRecord(const ndefType* type, ndefRecord* record) +{ + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_TNEP_STATUS) || + (record == NULL) ) + { + return ERR_PARAM; + } + + (void)ndefRecordReset(record); + + /* "Te" */ + (void)ndefRecordSetType(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufRtdTypeTnepStatus); + + (void)ndefRecordSetNdefType(record, type); + + return ERR_NONE; +} + +#endif diff --git a/components/spi-st25r3911b/NDEF/source/message/ndef_type_uri.c b/components/spi-st25r3911b/NDEF/source/message/ndef_type_uri.c new file mode 100644 index 0000000..1401c9e --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/message/ndef_type_uri.c @@ -0,0 +1,400 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF RTD URI type + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_types.h" +#include "ndef_type_uri.h" +#include "utils.h" + + +#if NDEF_TYPE_RTD_URI_SUPPORT + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/*! URI defines */ +#define NDEF_RTD_URI_PROTOCOL_LEN 1U /*!< URI protocol length */ +#define NDEF_RTD_URI_PAYLOAD_LENGTH_MIN (NDEF_RTD_URI_PROTOCOL_LEN + sizeof(uint8_t)) /*!< URI minimum payload length */ + +/*! URI defines */ +#define NDEF_RTD_URI_ID_CODE_OFFSET 0U /*!< URI Id code offset */ +#define NDEF_RTD_URI_FIELD_OFFSET 1U /*!< URI field offset */ + + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + + +/*! RTD URI Type string */ +static const uint8_t ndefRtdTypeUri[] = "U"; /*!< URI Record Type {0x55} */ + +const ndefConstBuffer8 bufRtdTypeUri = { ndefRtdTypeUri, sizeof(ndefRtdTypeUri) - 1U }; /*!< URI Record Type buffer */ + + +/*! URI Type strings */ +static const uint8_t ndefUriPrefixNone[] = ""; +static const uint8_t ndefUriPrefixHttpWww[] = "http://www."; +static const uint8_t ndefUriPrefixHttpsWww[] = "https://www."; +static const uint8_t ndefUriPrefixHttp[] = "http://"; +static const uint8_t ndefUriPrefixHttps[] = "https://"; +static const uint8_t ndefUriPrefixTel[] = "tel:"; +static const uint8_t ndefUriPrefixMailto[] = "mailto:"; +static const uint8_t ndefUriPrefixFtpAnonymous[] = "ftp://anonymous:anonymous@"; +static const uint8_t ndefUriPrefixFtpFtp[] = "ftp://ftp."; +static const uint8_t ndefUriPrefixFtps[] = "ftps://"; +static const uint8_t ndefUriPrefixSftp[] = "sftp://"; +static const uint8_t ndefUriPrefixSmb[] = "smb://"; +static const uint8_t ndefUriPrefixNfs[] = "nfs://"; +static const uint8_t ndefUriPrefixFtp[] = "ftp://"; +static const uint8_t ndefUriPrefixDav[] = "dav://"; +static const uint8_t ndefUriPrefixNews[] = "news:"; +static const uint8_t ndefUriPrefixTelnet[] = "telnet://"; +static const uint8_t ndefUriPrefixImap[] = "imap:"; +static const uint8_t ndefUriPrefixRtsp[] = "rtsp://"; +static const uint8_t ndefUriPrefixUrn[] = "urn:"; +static const uint8_t ndefUriPrefixPop[] = "pop:"; +static const uint8_t ndefUriPrefixSip[] = "sip:"; +static const uint8_t ndefUriPrefixSips[] = "sips:"; +static const uint8_t ndefUriPrefixTftp[] = "tftp:"; +static const uint8_t ndefUriPrefixBtspp[] = "btspp://"; +static const uint8_t ndefUriPrefixBtl2cap[] = "btl2cap://"; +static const uint8_t ndefUriPrefixBtgoep[] = "btgoep://"; +static const uint8_t ndefUriPrefixTcpobex[] = "tcpobex://"; +static const uint8_t ndefUriPrefixIrdaobex[] = "irdaobex://"; +static const uint8_t ndefUriPrefixFile[] = "file://"; +static const uint8_t ndefUriPrefixUrnEpcId[] = "urn:epc:id:"; +static const uint8_t ndefUriPrefixUrnEpcTag[] = "urn:epc:tag"; +static const uint8_t ndefUriPrefixUrnEpcPat[] = "urn:epc:pat:"; +static const uint8_t ndefUriPrefixUrnEpcRaw[] = "urn:epc:raw:"; +static const uint8_t ndefUriPrefixUrnEpe[] = "urn:epc:"; +static const uint8_t ndefUriPrefixUrnNfc[] = "urn:nfc:"; +static const uint8_t ndefUriPrefixEmpty[] = ""; /* Autodetect filler */ + +static const ndefConstBuffer ndefUriPrefix[NDEF_URI_PREFIX_COUNT] = +{ + { ndefUriPrefixNone , sizeof(ndefUriPrefixNone ) - 1U }, + { ndefUriPrefixHttpWww , sizeof(ndefUriPrefixHttpWww ) - 1U }, + { ndefUriPrefixHttpsWww , sizeof(ndefUriPrefixHttpsWww ) - 1U }, + { ndefUriPrefixHttp , sizeof(ndefUriPrefixHttp ) - 1U }, + { ndefUriPrefixHttps , sizeof(ndefUriPrefixHttps ) - 1U }, + { ndefUriPrefixTel , sizeof(ndefUriPrefixTel ) - 1U }, + { ndefUriPrefixMailto , sizeof(ndefUriPrefixMailto ) - 1U }, + { ndefUriPrefixFtpAnonymous, sizeof(ndefUriPrefixFtpAnonymous) - 1U }, + { ndefUriPrefixFtpFtp , sizeof(ndefUriPrefixFtpFtp ) - 1U }, + { ndefUriPrefixFtps , sizeof(ndefUriPrefixFtps ) - 1U }, + { ndefUriPrefixSftp , sizeof(ndefUriPrefixSftp ) - 1U }, + { ndefUriPrefixSmb , sizeof(ndefUriPrefixSmb ) - 1U }, + { ndefUriPrefixNfs , sizeof(ndefUriPrefixNfs ) - 1U }, + { ndefUriPrefixFtp , sizeof(ndefUriPrefixFtp ) - 1U }, + { ndefUriPrefixDav , sizeof(ndefUriPrefixDav ) - 1U }, + { ndefUriPrefixNews , sizeof(ndefUriPrefixNews ) - 1U }, + { ndefUriPrefixTelnet , sizeof(ndefUriPrefixTelnet ) - 1U }, + { ndefUriPrefixImap , sizeof(ndefUriPrefixImap ) - 1U }, + { ndefUriPrefixRtsp , sizeof(ndefUriPrefixRtsp ) - 1U }, + { ndefUriPrefixUrn , sizeof(ndefUriPrefixUrn ) - 1U }, + { ndefUriPrefixPop , sizeof(ndefUriPrefixPop ) - 1U }, + { ndefUriPrefixSip , sizeof(ndefUriPrefixSip ) - 1U }, + { ndefUriPrefixSips , sizeof(ndefUriPrefixSips ) - 1U }, + { ndefUriPrefixTftp , sizeof(ndefUriPrefixTftp ) - 1U }, + { ndefUriPrefixBtspp , sizeof(ndefUriPrefixBtspp ) - 1U }, + { ndefUriPrefixBtl2cap , sizeof(ndefUriPrefixBtl2cap ) - 1U }, + { ndefUriPrefixBtgoep , sizeof(ndefUriPrefixBtgoep ) - 1U }, + { ndefUriPrefixTcpobex , sizeof(ndefUriPrefixTcpobex ) - 1U }, + { ndefUriPrefixIrdaobex , sizeof(ndefUriPrefixIrdaobex ) - 1U }, + { ndefUriPrefixFile , sizeof(ndefUriPrefixFile ) - 1U }, + { ndefUriPrefixUrnEpcId , sizeof(ndefUriPrefixUrnEpcId ) - 1U }, + { ndefUriPrefixUrnEpcTag , sizeof(ndefUriPrefixUrnEpcTag ) - 1U }, + { ndefUriPrefixUrnEpcPat , sizeof(ndefUriPrefixUrnEpcPat ) - 1U }, + { ndefUriPrefixUrnEpcRaw , sizeof(ndefUriPrefixUrnEpcRaw ) - 1U }, + { ndefUriPrefixUrnEpe , sizeof(ndefUriPrefixUrnEpe ) - 1U }, + { ndefUriPrefixUrnNfc , sizeof(ndefUriPrefixUrnNfc ) - 1U }, + { ndefUriPrefixEmpty , sizeof(ndefUriPrefixEmpty ) - 1U } +}; + + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + + +/* + * URI + */ + + +/*****************************************************************************/ +static uint32_t ndefRtdUriPayloadGetLength(const ndefType* uri) +{ + const ndefTypeRtdUri* rtdUri; + + if ( (uri == NULL) || (uri->id != NDEF_TYPE_ID_RTD_URI) ) + { + return 0; + } + + rtdUri = &uri->data.uri; + + return sizeof(rtdUri->protocol) + rtdUri->bufUriString.length; +} + + +/*****************************************************************************/ +static const uint8_t* ndefRtdUriToPayloadItem(const ndefType* uri, ndefConstBuffer* bufItem, bool begin) +{ + static uint32_t item = 0; + const ndefTypeRtdUri* rtdUri; + + if ( (uri == NULL) || (uri->id != NDEF_TYPE_ID_RTD_URI) || + (bufItem == NULL) ) + { + return NULL; + } + + rtdUri = &uri->data.uri; + + if (begin == true) + { + item = 0; + } + + switch (item) + { + case 0: + /* Protocol byte */ + bufItem->buffer = &rtdUri->protocol; + bufItem->length = sizeof(rtdUri->protocol); + break; + + case 1: + /* URI string */ + bufItem->buffer = rtdUri->bufUriString.buffer; + bufItem->length = rtdUri->bufUriString.length; + break; + + default: + bufItem->buffer = NULL; + bufItem->length = 0; + break; + } + + /* Move to next item for next call */ + item++; + + return bufItem->buffer; +} + + +/*****************************************************************************/ +static ndefStatus ndefRtdUriProtocolAutodetect(uint8_t* protocol, ndefConstBuffer* bufUriString) +{ + if ( (protocol == NULL) || + (*protocol != NDEF_URI_PREFIX_AUTODETECT) || + (bufUriString == NULL) ) + { + return ERR_PARAM; + } + + for (uint8_t i = 0; i < NDEF_URI_PREFIX_COUNT; i++) /* Protocol fits in 1 byte => uint8_t */ + { + if (ndefUriPrefix[i].length > 0U) + { + if (ST_BYTECMP(bufUriString->buffer, ndefUriPrefix[i].buffer, ndefUriPrefix[i].length) == 0) + { + *protocol = i; + /* Move after the protocol string */ + bufUriString->buffer = &bufUriString->buffer[ndefUriPrefix[i].length]; + bufUriString->length -= ndefUriPrefix[i].length; + return ERR_NONE; + } + } + } + + *protocol = NDEF_URI_PREFIX_NONE; + + return ERR_NOTFOUND; +} + + +/*****************************************************************************/ +ndefStatus ndefRtdUriInit(ndefType* uri, uint8_t protocol, const ndefConstBuffer* bufUriString) +{ + ndefTypeRtdUri* rtdUri; + ndefConstBuffer bufUri; + uint8_t protocolDetect; + + if ( (uri == NULL) || (protocol >= NDEF_URI_PREFIX_COUNT) || + (bufUriString == NULL) || (bufUriString->buffer == NULL) || (bufUriString->length == 0U) ) + { + return ERR_PARAM; + } + + uri->id = NDEF_TYPE_ID_RTD_URI; + uri->getPayloadLength = ndefRtdUriPayloadGetLength; + uri->getPayloadItem = ndefRtdUriToPayloadItem; + uri->typeToRecord = ndefRtdUriToRecord; + rtdUri = &uri->data.uri; + + bufUri.buffer = bufUriString->buffer; + bufUri.length = bufUriString->length; + protocolDetect = protocol; + if (protocol == NDEF_URI_PREFIX_AUTODETECT) + { + /* Update protocol and URI buffer */ + (void)ndefRtdUriProtocolAutodetect(&protocolDetect, &bufUri); + } + rtdUri->protocol = protocolDetect; + + rtdUri->bufUriString.buffer = bufUri.buffer; + rtdUri->bufUriString.length = bufUri.length; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefGetRtdUri(const ndefType* uri, ndefConstBuffer* bufProtocol, ndefConstBuffer* bufUriString) +{ + const ndefTypeRtdUri* rtdUri; + + if ( (uri == NULL) || (uri->id != NDEF_TYPE_ID_RTD_URI) || + (bufProtocol == NULL) || (bufUriString == NULL) ) + { + return ERR_PARAM; + } + + rtdUri = &uri->data.uri; + + bufProtocol->buffer = ndefUriPrefix[rtdUri->protocol].buffer; + bufProtocol->length = ndefUriPrefix[rtdUri->protocol].length; + + bufUriString->buffer = rtdUri->bufUriString.buffer; + bufUriString->length = rtdUri->bufUriString.length; + + return ERR_NONE; +} + +/*****************************************************************************/ +static ndefStatus ndefPayloadToRtdUri(const ndefConstBuffer* bufUri, ndefType* uri) +{ + uint8_t protocol; + + if ( (bufUri == NULL) || (bufUri->buffer == NULL) || + (uri == NULL) ) + { + return ERR_PARAM; + } + + if (bufUri->length < NDEF_RTD_URI_PAYLOAD_LENGTH_MIN) + { + return ERR_PROTO; + } + + /* Extract info from the payload */ + protocol = bufUri->buffer[NDEF_RTD_URI_ID_CODE_OFFSET]; + + ndefConstBuffer bufStringUri; + bufStringUri.buffer = &bufUri->buffer[NDEF_RTD_URI_FIELD_OFFSET]; + bufStringUri.length = bufUri->length - sizeof(protocol); + + return ndefRtdUriInit(uri, protocol, &bufStringUri); +} + + +/*****************************************************************************/ +ndefStatus ndefRecordToRtdUri(const ndefRecord* record, ndefType* uri) +{ + const ndefType* type; + + if ( (record == NULL) || (uri == NULL) ) + { + return ERR_PARAM; + } + + if ( ! ndefRecordTypeMatch(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufRtdTypeUri)) /* "U" */ + { + return ERR_PROTO; + } + + type = ndefRecordGetNdefType(record); + if ( (type != NULL) && (type->id == NDEF_TYPE_ID_RTD_URI) ) + { + (void)ST_MEMCPY(uri, type, sizeof(ndefType)); + return ERR_NONE; + } + + return ndefPayloadToRtdUri(&record->bufPayload, uri); +} + + +/*****************************************************************************/ +ndefStatus ndefRtdUriToRecord(const ndefType* uri, ndefRecord* record) +{ + if ( (uri == NULL) || (uri->id != NDEF_TYPE_ID_RTD_URI) || + (record == NULL) ) + { + return ERR_PARAM; + } + + (void)ndefRecordReset(record); + + /* "U" */ + (void)ndefRecordSetType(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufRtdTypeUri); + + if (ndefRecordSetNdefType(record, uri) != ERR_NONE) + { + return ERR_PARAM; + } + + return ERR_NONE; +} + +#endif diff --git a/components/spi-st25r3911b/NDEF/source/message/ndef_type_vcard.c b/components/spi-st25r3911b/NDEF/source/message/ndef_type_vcard.c new file mode 100644 index 0000000..0c87450 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/message/ndef_type_vcard.c @@ -0,0 +1,723 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF MIME vCard type + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_types.h" +#include "ndef_type_vcard.h" +#include "utils.h" + + +#if NDEF_TYPE_VCARD_SUPPORT + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + + +/*! vCard Type strings */ +static const uint8_t ndefMediaTypeVCard[] = "text/x-vCard"; /*!< vCard Type */ + +const ndefConstBuffer8 bufMediaTypeVCard = { ndefMediaTypeVCard, sizeof(ndefMediaTypeVCard) - 1U }; /*!< vCard Type buffer */ + + +/*! vCard delimiters */ +static const uint8_t COLON[] = ":"; +static const uint8_t SEMICOLON[] = ";"; +static const uint8_t NEWLINE[] = "\r\n"; +static const uint8_t LINEFEED[] = "\n"; + +static const ndefConstBuffer bufColon = { COLON, sizeof(COLON) - 1U }; /*!< ":" */ +static const ndefConstBuffer bufSemicolon = { SEMICOLON, sizeof(SEMICOLON) - 1U }; /*!< ";" */ +static const ndefConstBuffer bufNewLine = { NEWLINE, sizeof(NEWLINE) - 1U }; /*!< "\r\n" */ +static const ndefConstBuffer bufLineFeed = { LINEFEED, sizeof(LINEFEED) - 1U }; /*!< "\n" */ + +/*! vCard Payload minimal length (BEGIN:VCARD + VERSION:2.1 + END:VCARD) */ +#define NDEF_VCARD_PAYLOAD_LENGTH_MIN ( sizeof("BEGIN:VCARD") - 1U + sizeof("VERSION:2.1") - 1U + sizeof("END:VCARD") - 1U ) + + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + + +/* + * VCard + */ + + +/* vCard Helper functions */ + + +/*****************************************************************************/ +bool ndefBufferMatch(const ndefConstBuffer* buf1, const ndefConstBuffer* buf2) +{ + if ( (buf1 == NULL) || (buf2 == NULL) ) + { + return false; + } + else if ( (buf1->buffer == buf2->buffer) && + (buf1->length == buf2->length) ) + { + return true; + } + else + { + if ( (buf1->length != 0U) && + (buf1->length == buf2->length) && + (ST_BYTECMP(buf1->buffer, buf2->buffer, buf1->length) == 0) ) + { + return true; + } + } + + return false; +} + + +/*****************************************************************************/ +static ndefStatus ndefBufferFind(const ndefConstBuffer* bufPayload, const ndefConstBuffer* bufMarker, uint32_t* offset) +{ + if ( (bufPayload == NULL) || (bufPayload->buffer == NULL) || + (bufMarker == NULL) || (bufMarker->buffer == NULL) ) + { + return ERR_PARAM; + } + + uint32_t i = 0; + while ((i + bufMarker->length) <= bufPayload->length) + { + ndefConstBuffer bufOffset; + bufOffset.buffer = &bufPayload->buffer[i]; + bufOffset.length = bufMarker->length; + + if (ndefBufferMatch(&bufOffset, bufMarker) == true) + { + if (offset != NULL) + { + *offset = i; + } + return ERR_NONE; + } + i++; + } + + return ERR_NOTFOUND; +} + + +/*****************************************************************************/ +static ndefStatus ndefVCardGetPropertyType(const ndefConstBuffer* bufProperty, ndefConstBuffer* bufType) +{ + ndefStatus err; + + if ( (bufProperty == NULL) || (bufType == NULL) ) + { + return ERR_PARAM; + } + + /* Look for the type delimiter semicolon ":" */ + uint32_t colonOffset; + err = ndefBufferFind(bufProperty, &bufColon, &colonOffset); + if (err != ERR_NONE) + { + return err; + } + + bufType->buffer = bufProperty->buffer; + bufType->length = colonOffset; + + /* Look for the subtype delimiter semicolon ";", if any */ + uint32_t semicolonOffset; + err = ndefBufferFind(bufProperty, &bufSemicolon, &semicolonOffset); + if (err == ERR_NONE) + { + bufType->length = MIN(semicolonOffset, colonOffset); /* Type is ahead ";" or ":" */ + } + + return ERR_NONE; +} + + +/*****************************************************************************/ +static ndefStatus ndefVCardGetPropertySubtype(const ndefConstBuffer* bufProperty, ndefConstBuffer* bufSubtype) +{ + ndefStatus err; + + ///* These parameters check are not needed as long as this function is only + // called internally (being static) because these parameters are checked by the caller */ + //if ( (bufProperty == NULL) || (bufSubtype == NULL) ) + //{ + // return ERR_PARAM; + //} + + /* Look for the type delimiter colon ":" */ + uint32_t colonOffset; + err = ndefBufferFind(bufProperty, &bufColon, &colonOffset); + if (err != ERR_NONE) + { + return err; + } + + /* Look for the subtype delimiter semicolon ";" */ + uint32_t semicolonOffset; + err = ndefBufferFind(bufProperty, &bufSemicolon, &semicolonOffset); + if (err != ERR_NONE) + { + return err; + } + + /* The subtype is between the first semicolon ";" delimiter and ":" delimiter */ + if (semicolonOffset < colonOffset) + { + bufSubtype->buffer = &bufProperty->buffer[semicolonOffset + bufSemicolon.length]; + bufSubtype->length = colonOffset - (semicolonOffset + bufSemicolon.length); + return ERR_NONE; + } + + return ERR_NOTFOUND; +} + + +/*****************************************************************************/ +static ndefStatus ndefVCardGetPropertyEOL(const ndefConstBuffer* bufProperty, ndefConstBuffer* bufEOL) +{ + ndefStatus err; + uint32_t offset; + + if ( (bufProperty == NULL) || (bufEOL == NULL) ) + { + return ERR_PARAM; + } + + /* Look for "\r\n" */ + err = ndefBufferFind(bufProperty, &bufNewLine, &offset); /* "\r\n" */ + if (err == ERR_NONE) + { + bufEOL->buffer = bufNewLine.buffer; + bufEOL->length = bufNewLine.length; + } + else + { + /* Look for "\n" */ + err = ndefBufferFind(bufProperty, &bufLineFeed, &offset); /* "\n" */ + if (err == ERR_NONE) + { + bufEOL->buffer = bufLineFeed.buffer; + bufEOL->length = bufLineFeed.length; + } + else + { + bufEOL->buffer = NULL; + bufEOL->length = 0; + } + } + + return ERR_NONE; +} + + +/*****************************************************************************/ +static ndefStatus ndefVCardGetPropertyValue(const ndefConstBuffer* bufProperty, ndefConstBuffer* bufValue) +{ + ndefStatus err; + + if ( (bufProperty == NULL) || (bufProperty->buffer == NULL) || + (bufValue == NULL) ) + { + return ERR_PARAM; + } + + /* Look for the type delimiter colon ":" */ + uint32_t colonOffset; + err = ndefBufferFind(bufProperty, &bufColon, &colonOffset); + if (err != ERR_NONE) + { + return err; + } + + /* Look for the End-Of-Line */ + ndefConstBuffer bufEOL; + err = ndefVCardGetPropertyEOL(bufProperty, &bufEOL); + if (err != ERR_NONE) + { + return err; + } + + /* Value between ":" and End-Of-Line */ + bufValue->buffer = &bufProperty->buffer[colonOffset + bufColon.length]; + bufValue->length = bufProperty->length - (colonOffset + bufColon.length + bufEOL.length); + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefVCardParseProperty(const ndefConstBuffer* bufProperty, ndefConstBuffer* bufType, ndefConstBuffer* bufSubtype, ndefConstBuffer* bufValue) +{ + ndefStatus err; + + if ( (bufProperty == NULL) || + (bufType == NULL) || (bufSubtype == NULL) || (bufValue == NULL) ) + { + return ERR_PARAM; + } + + err = ndefVCardGetPropertyType(bufProperty, bufType); + if (err != ERR_NONE) + { + return err; + } + + err = ndefVCardGetPropertySubtype(bufProperty, bufSubtype); + if (err != ERR_NONE) + { + /* Not all properties have a subtype */ + bufSubtype->buffer = NULL; + bufSubtype->length = 0; + } + + err = ndefVCardGetPropertyValue(bufProperty, bufValue); + if (err != ERR_NONE) + { + return err; + } + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefVCardSetProperty(ndefTypeVCard* vCard, const ndefConstBuffer* bufProperty) +{ + ndefStatus err; + + if ( (vCard == NULL) || (bufProperty == NULL) ) + { + return ERR_PARAM; + } + + /* Check the property contains a type */ + ndefConstBuffer bufPropertyType; + err = ndefVCardGetPropertyType(bufProperty, &bufPropertyType); + if (err != ERR_NONE) + { + return err; + } + + for (uint32_t i = 0; i < (uint32_t)SIZEOF_ARRAY(vCard->propertyBuffer); i++) + { + /* Find first free property */ + if (vCard->propertyBuffer[i] == NULL) + { + /* Append it */ + vCard->propertyBuffer[i] = bufProperty->buffer; + vCard->propertyLength[i] = (uint16_t)bufProperty->length; + return ERR_NONE; + } + else + { + /* Or update existing one */ + ndefConstBuffer vCardProperty; + vCardProperty.buffer = vCard->propertyBuffer[i]; + vCardProperty.length = (uint16_t)vCard->propertyLength[i]; + + ndefConstBuffer vCardPropertyType; + err = ndefVCardGetPropertyType(&vCardProperty, &vCardPropertyType); + if (err != ERR_NONE) + { + return err; + } + + if (ndefBufferMatch(&vCardPropertyType, &bufPropertyType) == true) + { + vCard->propertyBuffer[i] = bufProperty->buffer; + vCard->propertyLength[i] = (uint16_t)bufProperty->length; + return ERR_NONE; + } + } + } + + return ERR_NOMEM; +} + + +/*****************************************************************************/ +ndefStatus ndefVCardGetProperty(const ndefTypeVCard* vCard, const ndefConstBuffer* bufType, ndefConstBuffer* bufProperty) +{ + ndefStatus err; + + if ( (vCard == NULL) || + (bufType == NULL) || (bufType->buffer == NULL) ) + { + return ERR_PARAM; + } + + for (uint32_t i = 0; i < SIZEOF_ARRAY(vCard->propertyBuffer); i++) + { + ndefConstBuffer bufLine; + bufLine.buffer = vCard->propertyBuffer[i]; + bufLine.length = vCard->propertyLength[i]; + + ndefConstBuffer bufLineType; + err = ndefVCardGetPropertyType(&bufLine, &bufLineType); + if (err != ERR_NONE) + { + return ERR_NOTFOUND; + } + + if (ndefBufferMatch(&bufLineType, bufType) == true) + { + if (bufProperty != NULL) + { + bufProperty->buffer = bufLine.buffer; + bufProperty->length = bufLine.length; + } + return ERR_NONE; + } + } + + return ERR_NOTFOUND; +} + + +/*****************************************************************************/ +static uint32_t ndefVCardPayloadGetLength(const ndefType* type) +{ + const ndefTypeVCard* ndefData; + + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_MEDIA_VCARD) ) + { + return 0; + } + + ndefData = &type->data.vCard; + + uint32_t payloadLength = 0; + for (uint32_t i = 0; i < SIZEOF_ARRAY(ndefData->propertyBuffer); i++) + { + payloadLength += ndefData->propertyLength[i]; + } + + return payloadLength; +} + + +/*****************************************************************************/ +ndefStatus ndefVCardReset(ndefTypeVCard* vCard) +{ + if (vCard == NULL) + { + return ERR_PARAM; + } + + /* Initialize every property */ + for (uint32_t i = 0; i < (uint32_t)SIZEOF_ARRAY(vCard->propertyBuffer); i++) + { + vCard->propertyBuffer[i] = NULL; + vCard->propertyLength[i] = 0; + } + + return ERR_NONE; +} + + +/*****************************************************************************/ +static const uint8_t* ndefVCardToPayloadItem(const ndefType* type, ndefConstBuffer* bufItem, bool begin) +{ + static uint32_t item = 0; + const ndefTypeVCard* ndefData; + + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_MEDIA_VCARD) || + (bufItem == NULL) ) + { + return NULL; + } + + ndefData = &type->data.vCard; + + bufItem->buffer = NULL; + bufItem->length = 0; + + /* Initialization */ + if (begin == true) + { + item = 0; + } + + while (item < (uint32_t)SIZEOF_ARRAY(ndefData->propertyBuffer)) + { + bufItem->buffer = ndefData->propertyBuffer[item]; + bufItem->length = ndefData->propertyLength[item]; + + item++; + return bufItem->buffer; + } + + return bufItem->buffer; +} + + +/*****************************************************************************/ +ndefStatus ndefVCardInit(ndefType* type, const ndefTypeVCard* vCard) +{ + ndefTypeVCard* ndefData; + + if ( (type == NULL) || (vCard == NULL) ) + { + return ERR_PARAM; + } + + type->id = NDEF_TYPE_ID_MEDIA_VCARD; + type->getPayloadLength = ndefVCardPayloadGetLength; + type->getPayloadItem = ndefVCardToPayloadItem; + type->typeToRecord = ndefVCardToRecord; + ndefData = &type->data.vCard; + + /* Copy in a bulk */ + (void)ST_MEMCPY(ndefData, vCard, sizeof(ndefTypeVCard)); + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefGetVCard(const ndefType* type, ndefTypeVCard* vCard) +{ + const ndefTypeVCard* ndefData; + + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_MEDIA_VCARD) || + (vCard == NULL) ) + { + return ERR_PARAM; + } + + ndefData = &type->data.vCard; + + /* Copy in a bulk */ + (void)ST_MEMCPY(vCard, ndefData, sizeof(ndefTypeVCard)); + + return ERR_NONE; +} + + +/*****************************************************************************/ +static ndefStatus ndefVCardGetLine(const ndefConstBuffer* bufPayload, ndefConstBuffer* bufLine) +{ + ndefStatus err; + uint32_t offset; + + if ( (bufPayload == NULL) || (bufLine == NULL) ) + { + return ERR_PARAM; + } + + /* Look for "\r\n" */ + err = ndefBufferFind(bufPayload, &bufNewLine, &offset); /* "\r\n" */ + if (err == ERR_NONE) + { + /* Return up to the marker */ + bufLine->buffer = bufPayload->buffer; + bufLine->length = offset + bufNewLine.length; + } + else + { + /* Look for "\n" */ + err = ndefBufferFind(bufPayload, &bufLineFeed, &offset); /* "\n" */ + if (err == ERR_NONE) + { + /* Return up to the marker */ + bufLine->buffer = bufPayload->buffer; + bufLine->length = offset + bufLineFeed.length; + } + else + { + /* Return up to the end of the payload */ + bufLine->buffer = bufPayload->buffer; + bufLine->length = bufPayload->length; + } + } + + return ERR_NONE; +} + + +/*****************************************************************************/ +static ndefStatus ndefPayloadToVcard(const ndefConstBuffer* bufPayload, ndefType* type) +{ + /*! vCard keyword types */ + static const uint8_t TYPE_BEGIN[] = "BEGIN"; + static const uint8_t TYPE_END[] = "END"; + static const uint8_t TYPE_VERSION[] = "VERSION"; + /*static const uint8_t VALUE_VCARD[] = "VCARD";*/ + /*static const uint8_t VALUE_2_1[] = "2.1";*/ + + static const ndefConstBuffer bufTypeBegin = { TYPE_BEGIN, sizeof(TYPE_BEGIN) - 1U }; /*!< "BEGIN" */ + static const ndefConstBuffer bufTypeEnd = { TYPE_END, sizeof(TYPE_END) - 1U }; /*!< "END" */ + static const ndefConstBuffer bufTypeVersion = { TYPE_VERSION, sizeof(TYPE_VERSION) - 1U }; /*!< "VERSION" */ + /*static const ndefConstBuffer bufValueVCard = { VALUE_VCARD, sizeof(VALUE_VCARD) - 1U }; *//*!< "VCARD" */ + /*static const ndefConstBuffer bufValue_2_1 = { VALUE_2_1, sizeof(VALUE_2_1) - 1U }; *//*!< "2.1" */ + + ndefStatus err; + ndefTypeVCard* ndefData; + + ndefConstBuffer bufRemaining; + ndefConstBuffer bufLine; + + if ( (bufPayload == NULL) || (bufPayload->buffer == NULL) || + (type == NULL) ) + { + return ERR_PARAM; + } + + if (bufPayload->length < NDEF_VCARD_PAYLOAD_LENGTH_MIN) /* vCard Payload Min */ + { + return ERR_PROTO; + } + + type->id = NDEF_TYPE_ID_MEDIA_VCARD; + type->getPayloadLength = ndefVCardPayloadGetLength; + type->getPayloadItem = ndefVCardToPayloadItem; + type->typeToRecord = ndefVCardToRecord; + ndefData = &type->data.vCard; + + /* Reset the vCard before parsing the payload */ + if (ndefVCardReset(ndefData) != ERR_NONE) + { + return ERR_PARAM; + } + + uint32_t offset = 0; + while (offset < bufPayload->length) + { + /* Parse the remaining to find an "end of line" or reach the end of payload */ + bufRemaining.buffer = &bufPayload->buffer[offset]; + bufRemaining.length = bufPayload->length - offset; + + err = ndefVCardGetLine(&bufRemaining, &bufLine); + if (err != ERR_NONE) + { + return err; + } + + err = ndefVCardSetProperty(ndefData, &bufLine); + if (err != ERR_NONE) + { + return err; + } + + /* Move to the next line */ + offset += bufLine.length; + } + + /* Check BEGIN, VERSION and END types were found */ + ndefStatus err_begin = ndefVCardGetProperty(ndefData, &bufTypeBegin, NULL); + ndefStatus err_version = ndefVCardGetProperty(ndefData, &bufTypeVersion, NULL); + ndefStatus err_end = ndefVCardGetProperty(ndefData, &bufTypeEnd, NULL); + if ( (err_begin != ERR_NONE) || (err_version != ERR_NONE) || (err_end != ERR_NONE) ) + { + return ERR_SYNTAX; + } + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordToVCard(const ndefRecord* record, ndefType* type) +{ + const ndefType* ndefData; + + if ( (record == NULL) || (type == NULL) ) + { + return ERR_PARAM; + } + + if ( ! ndefRecordTypeMatch(record, NDEF_TNF_MEDIA_TYPE, &bufMediaTypeVCard)) /* "text/x-vCard" */ + { + return ERR_PROTO; + } + + ndefData = ndefRecordGetNdefType(record); + if ( (ndefData != NULL) && (type->id == NDEF_TYPE_ID_MEDIA_VCARD) ) + { + (void)ST_MEMCPY(type, ndefData, sizeof(ndefType)); + return ERR_NONE; + } + + return ndefPayloadToVcard(&record->bufPayload, type); +} + + +/*****************************************************************************/ +ndefStatus ndefVCardToRecord(const ndefType* type, ndefRecord* record) +{ + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_MEDIA_VCARD) || + (record == NULL) ) + { + return ERR_PARAM; + } + + (void)ndefRecordReset(record); + + (void)ndefRecordSetType(record, NDEF_TNF_MEDIA_TYPE, &bufMediaTypeVCard); + + if (ndefRecordSetNdefType(record, type) != ERR_NONE) + { + return ERR_PARAM; + } + + return ERR_NONE; +} + +#endif diff --git a/components/spi-st25r3911b/NDEF/source/message/ndef_type_wifi.c b/components/spi-st25r3911b/NDEF/source/message/ndef_type_wifi.c new file mode 100644 index 0000000..eb9a896 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/message/ndef_type_wifi.c @@ -0,0 +1,513 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF Wifi type + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_types.h" +#include "ndef_type_wifi.h" +#include "utils.h" + + +#if NDEF_TYPE_WIFI_SUPPORT + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + + +/*! Wifi Type strings */ +static const uint8_t ndefMediaTypeWifi[] = "application/vnd.wfa.wsc"; /*!< Wi-Fi Simple Configuration Type */ + +const ndefConstBuffer8 bufMediaTypeWifi = { ndefMediaTypeWifi, sizeof(ndefMediaTypeWifi) - 1U }; /*!< Wifi Type buffer */ + + +/*! Wifi OBB (WPS) */ + +#define NDEF_WIFI_DEFAULT_NETWORK_KEY "00000000" /*! Network key to be used when the Authentication is set to None. + Althought WPS defines a 0-length network key in such case, + a 8 digit value is required with tested phones. */ + +#define NDEF_WIFI_NETWORK_SSID_LENGTH 32U /*!< Network SSID length */ +#define NDEF_WIFI_NETWORK_KEY_LENGTH 32U /*!< Network Key length */ + +#define NDEF_WIFI_ENCRYPTION_TYPE_LENGTH 2U /*!< Encryption type length */ +#define NDEF_WIFI_AUTHENTICATION_TYPE_LENGTH 2U /*!< Authentication type length */ +#define WIFI_SSID_TYPE_LENGTH 2U /*!< SSID type length */ +#define WIFI_SSID_KEY_TYPE_LENGTH 2U /*!< SSID key type length */ + +#define NDEF_WIFI_ATTRIBUTE_ID_SSID_LSB 0x10U /*!< SSID Attribute ID LSB */ +#define NDEF_WIFI_ATTRIBUTE_ID_SSID_MSB 0x45U /*!< SSID Attribute ID MSB */ + +#define NDEF_WIFI_ATTRIBUTE_ID_NETWORK_LSB 0x10U /*!< Network Attribute ID LSB */ +#define NDEF_WIFI_ATTRIBUTE_ID_NETWORK_MSB 0x27U /*!< Network Attribute ID MSB */ + +#define NDEF_WIFI_ATTRIBUTE_ENCRYPTION 0x0FU /*!< Encryption attribute */ +#define NDEF_WIFI_ATTRIBUTE_AUTHENTICATION 0x03U /*!< Authentication attribute */ + +#define NDEF_WIFI_ATTRIBUTE_ID_OFFSET 0x01U /*!< Attribute Id offset */ +#define NDEF_WIFI_ATTRIBUTE_LENGTH_MSB_OFFSET 0x02U /*!< Attribute length MSB offset */ +#define NDEF_WIFI_ATTRIBUTE_LENGTH_LSB_OFFSET 0x03U /*!< Attribute length LSB offset */ +#define NDEF_WIFI_ATTRIBUTE_DATA_OFFSET 0x04U /*!< Attribute data offset */ +#define NDEF_WIFI_ATTRIBUTE_ENCRYPTION_LSB_OFFSET 0x05U /*!< Attribute encryption offset */ +#define NDEF_WIFI_ATTRIBUTE_AUTHENTICATION_LSB_OFFSET 0x05U /*!< Attribute authentication offset */ + + +static uint8_t wifiConfigToken1[] = { + 0x10, 0x4A, /* Attribute ID: Version */ + 0x00, 0x01, /* Attribute ID Length */ + 0x10, /* Version 1.0 */ + 0x10, 0x0E, /* Attribute ID Credential */ + 0x00, 0x48, /* Attribute ID Length */ + 0x10, 0x26, /* Attribute ID: Network Index */ + 0x00, 0x01, /* Attribute Length */ + 0x01, /* Index */ + 0x10, 0x45 /* Attribute ID: SSID */ +}; + +static uint8_t wifiConfigToken3[] = { + 0x10, 0x03, /* Attribute ID:Authentication Type */ + 0x00, 0x02, /* Attribute Length */ + 0x00, 0x01, /* Attribute Type: Open */ + 0x10, 0x0F, /* Attribute ID: Encryption Type */ + 0x00, 0x02, /* Attribute Length */ + 0x00, 0x01, /* Encryption Type: None */ + 0x10, 0x27 /* Attribute ID: Network Key */ +}; + +static uint8_t wifiConfigToken5[] = { + 0x10, 0x20, /* Attribute ID: MAC Address */ + 0x00, 0x06, /* Attribute Length */ + 0, /* MAC-ADDRESS */ + 0, /* MAC-ADDRESS */ + 0, /* MAC-ADDRESS */ + 0, /* MAC-ADDRESS */ + 0, /* MAC-ADDRESS */ + 0, /* MAC-ADDRESS */ + 0x10, 0x49, /* Attribute ID: Vendor Extension */ + 0x00, 0x06, /* Attribute Length */ + 0x00, 0x37, 0x2A, /* Vendor ID: WFA */ + 0x02, /* Subelement ID:Network Key Shareable */ + 0x01, /* Subelement Length */ + 0x01, /* Network Key Shareable: TRUE */ + 0x10, 0x49, /* Attribute ID: Vendor Extension */ + 0x00, 0x06, /* Attribute Length */ + 0x00, 0x37, 0x2A, /* Vendor ID: WFA */ + 0x00, /* Subelement ID: Version2 */ + 0x01, /* Subelement Length: 1 */ + 0x20 /* Version 2 */ +}; + + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + + +/*****************************************************************************/ +/*! Manage a Wifi Out-Of-Band NDEF message, to start a communication based on Wifi. + * The Wifi OOB format is described by the Wifi Protected Setup specification. + * It consists in a list of data elements formated as type-length-value. + + The Wifi OOB in a NDEF record has the following structure: + - Version + - Credential + - Network index + - SSID + - Authentication Type + - Encryption Type + - Network Key + - MAC Address + - Vendor Extension + - Network Key Shareable + - Vendor Extension + - Version2 + + Note: If the `Network key` is set to an empty buffer, the library sets it to "0x00000000" + Even if 0-length Network Key is supposed to be supported, smartphones dont necessarily accept it. + */ + + +/*****************************************************************************/ +static uint32_t ndefWifiPayloadGetLength(const ndefType* wifi) +{ + const ndefTypeWifi* wifiData; + uint32_t payloadLength; + + if ( (wifi == NULL) || (wifi->id != NDEF_TYPE_ID_MEDIA_WIFI) ) + { + return 0; + } + + wifiData = &wifi->data.wifi; + + payloadLength = sizeof(wifiConfigToken1) + + WIFI_SSID_TYPE_LENGTH + wifiData->bufNetworkSSID.length + + sizeof(wifiConfigToken3) + + WIFI_SSID_KEY_TYPE_LENGTH + wifiData->bufNetworkKey.length + + sizeof(wifiConfigToken5); + + return payloadLength; +} + + +/*****************************************************************************/ +static const uint8_t* ndefWifiToPayloadItem(const ndefType* wifi, ndefConstBuffer* bufItem, bool begin) +{ + static uint32_t item = 0; + const ndefTypeWifi* wifiData; + uint16_t credentialLength; + + static const uint8_t defaultKey[4] = {0, 0, 0, 0}; + ndefConstBuffer8 bufDefaultNetworkKey = { defaultKey, sizeof(defaultKey) }; + + const uint8_t CONFIG_TOKEN_1_CREDENTIAL_LENGTH_INDEX = 7U; + const uint8_t CONFIG_TOKEN_3_AUTHENTICATION_TYPE_INDEX = 5U; + const uint8_t CONFIG_TOKEN_3_ENCRYPTION_TYPE_INDEX = 11U; + + static uint8_t zero[] = { 0 }; + static ndefConstBuffer8 bufZero = { zero, sizeof(zero) }; + + if ( (wifi == NULL) || (wifi->id != NDEF_TYPE_ID_MEDIA_WIFI) || + (bufItem == NULL) ) + { + return NULL; + } + + wifiData = &wifi->data.wifi; + + if (begin == true) + { + item = 0; + } + + bufItem->buffer = NULL; + bufItem->length = 0; + + switch (item) + { + case 0: + /* Config Token1 */ + + /* Update Token1 with credential length */ + credentialLength = (uint16_t)(5U + /* Network index */ + 2U + /* SSID type */ + 2U + /* SSID key length */ + wifiData->bufNetworkSSID.length + /* SSID key */ + sizeof(wifiConfigToken3) + /* Token3 length */ + 2U + /* Network key length */ + wifiData->bufNetworkKey.length + /* Network key */ + sizeof(wifiConfigToken5)); /* Token5 length */ + + wifiConfigToken1[CONFIG_TOKEN_1_CREDENTIAL_LENGTH_INDEX] = (uint8_t)(credentialLength >> 8U); + wifiConfigToken1[CONFIG_TOKEN_1_CREDENTIAL_LENGTH_INDEX + 1U] = (uint8_t)(credentialLength & 0xFFU); + + bufItem->buffer = wifiConfigToken1; + bufItem->length = sizeof(wifiConfigToken1); + break; + + case 1: + /* SSID Length (1st byte) */ + bufItem->buffer = bufZero.buffer; + bufItem->length = bufZero.length; + break; + + case 2: + /* SSID Length (2nd byte) */ + bufItem->buffer = (const uint8_t*)&wifiData->bufNetworkSSID.length; + bufItem->length = 1U; + break; + + case 3: + /* SSID Value */ + bufItem->buffer = wifiData->bufNetworkSSID.buffer; + bufItem->length = wifiData->bufNetworkSSID.length; + break; + + case 4: + /* Config Token3 */ + + /* Update Token3 with Autentication and Encryption Types */ + wifiConfigToken3[CONFIG_TOKEN_3_AUTHENTICATION_TYPE_INDEX] = wifiData->authentication; + wifiConfigToken3[CONFIG_TOKEN_3_ENCRYPTION_TYPE_INDEX] = wifiData->encryption; + + bufItem->buffer = wifiConfigToken3; + bufItem->length = sizeof(wifiConfigToken3); + break; + + case 5: + /* SSID Key Length (1st byte) */ + bufItem->buffer = bufZero.buffer; + bufItem->length = bufZero.length; + break; + + case 6: + /* SSID Key Length (2 bytes) */ + bufItem->buffer = (const uint8_t*)&wifiData->bufNetworkKey.length; + bufItem->length = 1U; + break; + + case 7: + /* SSID Key Value */ + if(wifiData->bufNetworkKey.length == 0U) + { + /* Empty network key is not supported by Phones */ + bufItem->buffer = bufDefaultNetworkKey.buffer; + bufItem->length = bufDefaultNetworkKey.length; + } + else + { + bufItem->buffer = wifiData->bufNetworkKey.buffer; + bufItem->length = wifiData->bufNetworkKey.length; + } + break; + + case 8: + /* Config Token5 */ + bufItem->buffer = wifiConfigToken5; + bufItem->length = sizeof(wifiConfigToken5); + break; + + default: + bufItem->buffer = NULL; + bufItem->length = 0; + break; + } + + /* Move to next item for next call */ + item++; + + return bufItem->buffer; +} + + +/*****************************************************************************/ +ndefStatus ndefWifiInit(ndefType* wifi, const ndefTypeWifi* wifiConfig) +{ + ndefTypeWifi* wifiData; + + if ( (wifi == NULL) || (wifiConfig == NULL) ) + { + return ERR_PARAM; + } + + wifi->id = NDEF_TYPE_ID_MEDIA_WIFI; + wifi->getPayloadLength = ndefWifiPayloadGetLength; + wifi->getPayloadItem = ndefWifiToPayloadItem; + wifi->typeToRecord = ndefWifiToRecord; + wifiData = &wifi->data.wifi; + + wifiData->bufNetworkSSID = wifiConfig->bufNetworkSSID; + wifiData->bufNetworkKey = wifiConfig->bufNetworkKey; + wifiData->authentication = wifiConfig->authentication; + wifiData->encryption = wifiConfig->encryption; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefGetWifi(const ndefType* wifi, ndefTypeWifi* wifiConfig) +{ + const ndefTypeWifi* wifiData; + + if ( (wifi == NULL) || (wifi->id != NDEF_TYPE_ID_MEDIA_WIFI) || + (wifiConfig == NULL) ) + { + return ERR_PARAM; + } + + wifiData = &wifi->data.wifi; + + wifiConfig->bufNetworkSSID.buffer = wifiData->bufNetworkSSID.buffer; + wifiConfig->bufNetworkSSID.length = wifiData->bufNetworkSSID.length; + wifiConfig->bufNetworkKey.buffer = wifiData->bufNetworkKey.buffer; + wifiConfig->bufNetworkKey.length = wifiData->bufNetworkKey.length; + wifiConfig->authentication = wifiData->authentication; + wifiConfig->encryption = wifiData->encryption; + + return ERR_NONE; +} + + +/*****************************************************************************/ +static ndefStatus ndefPayloadToWifi(const ndefConstBuffer* bufPayload, ndefType* wifi) +{ + ndefTypeWifi wifiConfig; + uint32_t offset; + + if ( (bufPayload == NULL) || (bufPayload->buffer == NULL) || + (wifi == NULL) ) + { + return ERR_PARAM; + } + + wifiConfig.bufNetworkSSID.buffer = NULL; + wifiConfig.bufNetworkSSID.length = 0; + wifiConfig.bufNetworkKey.buffer = NULL; + wifiConfig.bufNetworkKey.length = 0; + wifiConfig.authentication = 0; + wifiConfig.encryption = 0; + + offset = 0; + while (offset < bufPayload->length) + { + uint8_t attribute = bufPayload->buffer[offset]; + if (attribute == NDEF_WIFI_ATTRIBUTE_ID_SSID_LSB) + { + uint8_t data1 = bufPayload->buffer[offset + NDEF_WIFI_ATTRIBUTE_LENGTH_MSB_OFFSET]; + uint8_t data2 = bufPayload->buffer[offset + NDEF_WIFI_ATTRIBUTE_LENGTH_LSB_OFFSET]; + uint32_t length = ((uint32_t)data1 << 8U) | data2; + + switch (bufPayload->buffer[offset + NDEF_WIFI_ATTRIBUTE_ID_OFFSET]) + { + case NDEF_WIFI_ATTRIBUTE_ID_SSID_MSB: + /* Network SSID */ + if (length > NDEF_WIFI_NETWORK_SSID_LENGTH) + { + return ERR_PROTO; + } + wifiConfig.bufNetworkSSID.buffer = &bufPayload->buffer[offset + NDEF_WIFI_ATTRIBUTE_DATA_OFFSET]; + wifiConfig.bufNetworkSSID.length = length; + offset += (NDEF_WIFI_ATTRIBUTE_DATA_OFFSET + length); + break; + case NDEF_WIFI_ATTRIBUTE_ID_NETWORK_MSB: + /* Network key */ + if (length > NDEF_WIFI_NETWORK_KEY_LENGTH) + { + return ERR_PROTO; + } + wifiConfig.bufNetworkKey.buffer = &bufPayload->buffer[offset + NDEF_WIFI_ATTRIBUTE_DATA_OFFSET]; + wifiConfig.bufNetworkKey.length = length; + offset += (NDEF_WIFI_ATTRIBUTE_DATA_OFFSET + length); + break; + case NDEF_WIFI_ATTRIBUTE_AUTHENTICATION: + /* Authentication */ + if (length != NDEF_WIFI_AUTHENTICATION_TYPE_LENGTH) + { + return ERR_PROTO; + } + wifiConfig.authentication = bufPayload->buffer[offset + NDEF_WIFI_ATTRIBUTE_AUTHENTICATION_LSB_OFFSET]; + offset += (NDEF_WIFI_ATTRIBUTE_DATA_OFFSET + length); + break; + case NDEF_WIFI_ATTRIBUTE_ENCRYPTION: + /* Encryption */ + if (length != NDEF_WIFI_ENCRYPTION_TYPE_LENGTH) + { + return ERR_PROTO; + } + wifiConfig.encryption = bufPayload->buffer[offset + NDEF_WIFI_ATTRIBUTE_ENCRYPTION_LSB_OFFSET]; + offset += (NDEF_WIFI_ATTRIBUTE_DATA_OFFSET + length); + break; + default: + offset++; + break; + } + } + else + { + offset++; + } + } + + return ndefWifiInit(wifi, &wifiConfig); +} + + +/*****************************************************************************/ +ndefStatus ndefRecordToWifi(const ndefRecord* record, ndefType* wifi) +{ + const ndefType* type; + + if ( (record == NULL) || (wifi == NULL) ) + { + return ERR_PARAM; + } + + if ( ! ndefRecordTypeMatch(record, NDEF_TNF_MEDIA_TYPE, &bufMediaTypeWifi)) /* "application/vnd.wfa.wsc" */ + { + return ERR_PROTO; + } + + type = ndefRecordGetNdefType(record); + if ( (type != NULL) && (type->id == NDEF_TYPE_ID_MEDIA_WIFI) ) + { + (void)ST_MEMCPY(wifi, type, sizeof(ndefType)); + return ERR_NONE; + } + + return ndefPayloadToWifi(&record->bufPayload, wifi); +} + + +/*****************************************************************************/ +ndefStatus ndefWifiToRecord(const ndefType* wifi, ndefRecord* record) +{ + if ( (wifi == NULL) || (wifi->id != NDEF_TYPE_ID_MEDIA_WIFI) || + (record == NULL) ) + { + return ERR_PARAM; + } + + (void)ndefRecordReset(record); + + (void)ndefRecordSetType(record, NDEF_TNF_MEDIA_TYPE, &bufMediaTypeWifi); + + if (ndefRecordSetNdefType(record, wifi) != ERR_NONE) + { + return ERR_PARAM; + } + + return ERR_NONE; +} + +#endif diff --git a/components/spi-st25r3911b/NDEF/source/message/ndef_type_wlc.c b/components/spi-st25r3911b/NDEF/source/message/ndef_type_wlc.c new file mode 100644 index 0000000..b506c02 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/message/ndef_type_wlc.c @@ -0,0 +1,1205 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2020 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF WLC (Wireless Charging) types + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_types.h" +#include "ndef_type_wlc.h" +#include "utils.h" + + +#if NDEF_TYPE_RTD_WLC_SUPPORT + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +#define NDEF_TYPE_RTD_WLC_PAYLOAD_LENGTH 6U /*!< WLC Capability/Poll Info/Listen Control Records Payload Length */ + +#define NDEF_TYPE_RTD_WLC_STATUS_INFO_MIN_PAYLOAD_LENGTH 1U /*!< WLC Status Info Record Payload min length */ +#define NDEF_TYPE_RTD_WLC_STATUS_INFO_MAX_PAYLOAD_LENGTH 9U /*!< WLC Status Info Record Payload max length */ + + +/* WLC Capability */ +#define NDEF_WLC_CAPABILITY_PROTOCOL_VERSION_OFFSET 0U /*!< WLC Capability Protocol Version Offset */ +#define NDEF_WLC_CAPABILITY_CONFIG_OFFSET 1U /*!< WLC Capability Config Offset */ +#define NDEF_WLC_CAPABILITY_WT_INT_OFFSET 2U /*!< WLC Capability WT INT Offset */ +#define NDEF_WLC_CAPABILITY_NDEF_RD_WT_OFFSET 3U /*!< WLC Capability NDEF RD WT Offset */ +#define NDEF_WLC_CAPABILITY_NDEF_WR_TO_INT_OFFSET 4U /*!< WLC Capability NDEF WR TO INT Offset */ +#define NDEF_WLC_CAPABILITY_NDEF_WR_WT_INT_OFFSET 5U /*!< WLC Capability NDEF WR WT INT Offset */ + +/* WLC Config: Protocol Version */ +//#define NDEF_WLC_CAPABILITY_PROTOCOL_MAJOR_VERSION_SHIFT 4U /*!< WLC Capability Protocol Major Version bit shift */ +//#define NDEF_WLC_CAPABILITY_PROTOCOL_VERSION_MASK 0xFU /*!< WLC Capability Protocol Major Version mask */ + +/* WLC Config: Mode Req */ +#define NDEF_WLC_CAPABILITY_CONFIG_MODE_REQ_SHIFT 6U /*! WLC Capability Config Req Mode bit shift */ +#define NDEF_WLC_CAPABILITY_CONFIG_MODE_REQ_MASK 3U /*! WLC Capability Config Req Mode mask */ + +/* WLC Config: Nego Wait Retry */ +#define NDEF_WLC_CAPABILITY_CONFIG_WAIT_TIME_RETRY_SHIFT 2U /*! WLC Capability config Nego Wait Retry bit shift */ +#define NDEF_WLC_CAPABILITY_CONFIG_WAIT_TIME_RETRY_MASK 0xFU /*! WLC Capability config Nego Wait Retry mask */ + +/* WLC Config: Nego Wait Retry flag */ +#define NDEF_WLC_CAPABILITY_CONFIG_NEGO_WAIT_SHIFT 1U /*! WLC Capability config Nego Wait bit shift */ +#define NDEF_WLC_CAPABILITY_CONFIG_NEGO_WAIT_MASK 1U /*! WLC Capability config Nego Wait mask */ + +/* WLC Config: Rd Conf flag */ +#define NDEF_WLC_CAPABILITY_CONFIG_RD_CONF_SHIFT 0U /*! WLC Capability config Rd Conf bit shift */ +#define NDEF_WLC_CAPABILITY_CONFIG_RD_CONF_MASK 1U /*! WLC Capability config Rd Conf mask */ + +/* WLC Config: CapWtInt RFU */ +#define NDEF_WLC_CAPABILITY_CONFIG_CAP_WT_INT_RFU_SHIFT 5U /*! WLC Capability config CapWtInt RFU bit shift */ +#define NDEF_WLC_CAPABILITY_CONFIG_CAP_WT_INT_RFU_MASK 0x7U /*! WLC Capability config CapWtInt RFU mask */ + +/* WLC Config: CapWtInt */ +#define NDEF_WLC_CAPABILITY_CONFIG_CAP_WT_INT_SHIFT 0U /*! WLC Capability config CapWtInt bit shift */ +#define NDEF_WLC_CAPABILITY_CONFIG_CAP_WT_INT_MASK 0x1FU /*! WLC Capability config CapWtInt mask */ + +//#define NDEF_WLC_CAPABILITY_CONFIG_CAP_WT_INT_MAX 0x13U /*! WLC Capability config CapWtInt max value */ +//#define NDEF_WLC_CAPABILITY_CONFIG_CAP_WT_INT_MASK 0x1FU /*! WLC Capability config CapWtInt mask */ + +//#define NDEF_WLC_CAPABILITY_CONFIG_RD_CONF_MASK 1U /*! WLC Capability config Rd Conf mask */ + +/* WLC Status and Information */ +#define NDEF_WLC_STATUSINFO_CONTROL_BYTE_1_OFFSET 0U /*! WLC Status and Info Control byte 1 offset */ + +/* WLC Poll Info */ +#define NDEF_WLC_POLL_INFO_PTX_OFFSET 0U /*!< WLC Poll Info P Tx Offset */ +#define NDEF_WLC_POLL_INFO_WLC_P_CAPABILITY_OFFSET 1U /*!< WLC Poll Info WLC-P Capability Offset */ +#define NDEF_WLC_POLL_INFO_POWER_CLASS_OFFSET 1U /*!< WLC Poll Info Power Class Offset */ +#define NDEF_WLC_POLL_INFO_TOT_POWER_STEPS_OFFSET 2U /*!< WLC Poll Info Total Power Steps Offset */ +#define NDEF_WLC_POLL_INFO_CUR_POWER_STEP_OFFSET 3U /*!< WLC Poll Info Current Power Step Offset */ +#define NDEF_WLC_POLL_INFO_NEXT_MIN_STEP_INC_OFFSET 4U /*!< WLC Poll Info Next Min Step Inc Offset */ +#define NDEF_WLC_POLL_INFO_NEXT_MIN_STEP_DEC_OFFSET 5U /*!< WLC Poll Info Next Min Step Dec Offset */ + +#define NDEF_WLC_POLL_INFO_WLC_P_CAPABILITY_SHIFT 4U /*!< WLC Poll Info WLC-P Capability bit shift */ +#define NDEF_WLC_POLL_INFO_WLC_P_CAPABILITY_MASK 0xFU /*!< WLC Poll Info WLC-P Capability mask */ + +/* WLC Listen Ctl */ +#define NDEF_WLC_LISTEN_CTL_STATUS_INFO_OFFSET 0U /*!< WLC Listen Control Status Info Offset */ +#define NDEF_WLC_LISTEN_CTL_WPT_CONFIG_OFFSET 1U /*!< WLC Listen Control WPT Config Offset */ +#define NDEF_WLC_LISTEN_CTL_POWER_ADJ_REQ_OFFSET 2U /*!< WLC Listen Control Power Adjust Request Offset */ +#define NDEF_WLC_LISTEN_CTL_BATTERY_LEVEL_OFFSET 3U /*!< WLC Listen Control Battery Level Offset */ +#define NDEF_WLC_LISTEN_CTL_DRV_INFO_OFFSET 4U /*!< WLC Listen Control Drv Info Offset */ +#define NDEF_WLC_LISTEN_CTL_HOLD_OFF_WT_INT_OFFSET 5U /*!< WLC Listen Control Hold Off WT INT Offset */ +#define NDEF_WLC_LISTEN_CTL_ERROR_INFO_OFFSET 5U /*!< WLC Listen Control Error Info Offset */ + +/* WLC Listen Ctl: Status Info */ +#define NDEF_WLC_LISTEN_CTL_STATUS_INFO_ERROR_SHIFT 7U /*! WLC Listen Control Status Error Flag bit shift */ +#define NDEF_WLC_LISTEN_CTL_STATUS_INFO_ERROR_MASK 1U /*! WLC Listen Control Status Error Flag mask */ + +/* WLC Listen Ctl: Battery Status */ +#define NDEF_WLC_LISTEN_CTL_STATUS_INFO_BATTERY_SHIFT 3U /*! WLC Listen Control Battery Status bit shift */ +#define NDEF_WLC_LISTEN_CTL_STATUS_INFO_BATTERY_MASK 3U /*! WLC Listen Control Battery Status mask */ + +/* WLC Listen Ctl: Status Counter */ +#define NDEF_WLC_LISTEN_CTL_STATUS_INFO_COUNTER_SHIFT 0U /*! WLC Listen Control Status Counter bit shift */ +#define NDEF_WLC_LISTEN_CTL_STATUS_INFO_COUNTER_MASK 0x7U /*! WLC Listen Control Status Counter Status mask */ + +/* WLC Listen Ctl: WPT Config Req */ +#define NDEF_WLC_LISTEN_CTL_WPT_CONFIG_REQ_SHIFT 6U /*! WLC Listen Control WPT Config Req bit shift */ +#define NDEF_WLC_LISTEN_CTL_WPT_CONFIG_REQ_MASK 3U /*! WLC Listen Control WPT Config Req mask */ + +/* WLC Listen Ctl: WPT Config Duration */ +#define NDEF_WLC_LISTEN_CTL_WPT_CONFIG_DURATION_SHIFT 1U /*! WLC Listen Control WPT Config Duration bit shift */ +#define NDEF_WLC_LISTEN_CTL_WPT_CONFIG_DURATION_MASK 0x1FU /*! WLC Listen Control WPT Config Duration mask */ + +/* WLC Listen Ctl: WPT Config Info Request */ +#define NDEF_WLC_LISTEN_CTL_WPT_CONFIG_INFO_REQ_SHIFT 0U /*! WLC Listen Control WPT Config Info Request bit shift */ +#define NDEF_WLC_LISTEN_CTL_WPT_CONFIG_INFO_REQ_MASK 1U /*! WLC Listen Control WPT Config Info Request mask */ + +/* WLC Listen Ctl: DRV Info Flag */ +#define NDEF_WLC_LISTEN_CTL_DRV_INFO_FLAG_SHIFT 6U /*! WLC Listen Control Drv Info Flag bit shift */ +#define NDEF_WLC_LISTEN_CTL_DRV_INFO_FLAG_MASK 3U /*! WLC Listen Control Drv Info Flag mask */ + +/* WLC Listen Ctl: DRV Info Int */ +#define NDEF_WLC_LISTEN_CTL_DRV_INFO_INT_SHIFT 0U /*! WLC Listen Control Drv Info Int bit shift */ +#define NDEF_WLC_LISTEN_CTL_DRV_INFO_INT_MASK 0x3FU /*! WLC Listen Control Drv Info Int mask */ + +/* WLC Listen Ctl: Error Info/WLC Protocol Error */ +#define NDEF_WLC_LISTEN_CTL_ERROR_INFO_PROTOCOL_SHIFT 1U /*! WLC Listen Control Error Info Protocol bit shift */ +#define NDEF_WLC_LISTEN_CTL_ERROR_INFO_PROTOCOL_MASK 1U /*! WLC Listen Control Error Info Protocol mask */ + +/* WLC Listen Ctl: Error Info/Temperature */ +#define NDEF_WLC_LISTEN_CTL_ERROR_INFO_TEMPERATURE_SHIFT 0U /*! WLC Listen Control Error Info Temperature bit shift */ +#define NDEF_WLC_LISTEN_CTL_ERROR_INFO_TEMPERATURE_MASK 1U /*! WLC Listen Control Error Info Temperature mask */ + + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + + +/*! RTD WLC Type strings */ +static const uint8_t ndefRtdTypeWlcCapability[] = "WLCCAP"; /*!< WLC Capability Record Type */ +static const uint8_t ndefRtdTypeWlcStatusInfo[] = "WLCSTAI"; /*!< WLC Status and Information Record Type */ +static const uint8_t ndefRtdTypeWlcPollInfo[] = "WLCINF"; /*!< WLC Poll Info Record Type */ +static const uint8_t ndefRtdTypeWlcListenCtl[] = "WLCCTL"; /*!< WLC Listen Control Record Type */ + +const ndefConstBuffer8 bufTypeRtdWlcCapability = { ndefRtdTypeWlcCapability, sizeof(ndefRtdTypeWlcCapability) - 1U }; /*!< WLC Capabiilty Type Record buffer */ +const ndefConstBuffer8 bufTypeRtdWlcStatusInfo = { ndefRtdTypeWlcStatusInfo, sizeof(ndefRtdTypeWlcStatusInfo) - 1U }; /*!< WLC Capabiilty Type Record buffer */ +const ndefConstBuffer8 bufTypeRtdWlcPollInfo = { ndefRtdTypeWlcPollInfo, sizeof(ndefRtdTypeWlcPollInfo) - 1U }; /*!< WLC Poll Information Type Record buffer */ +const ndefConstBuffer8 bufTypeRtdWlcListenCtl = { ndefRtdTypeWlcListenCtl, sizeof(ndefRtdTypeWlcListenCtl) - 1U }; /*!< WLC Listen Control Type Record buffer */ + + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + + +/*****************************************************************************/ +/* + * WLC Capability + */ +/*****************************************************************************/ + + +/*****************************************************************************/ +static uint32_t ndefRtdWlcCapabilityGetPayloadLength(const ndefType* type) +{ + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_WLCCAP) ) + { + return 0; + } + + return NDEF_TYPE_RTD_WLC_PAYLOAD_LENGTH; +} + + +/*****************************************************************************/ +static const uint8_t* ndefRtdWlcCapabilityGetPayloadItem(const ndefType* type, ndefConstBuffer* bufItem, bool begin) +{ + static uint32_t item = 0; + static uint8_t temp = 0; + const ndefTypeRtdWlcCapability* ndefData; + + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_WLCCAP) || + (bufItem == NULL) ) + { + return NULL; + } + + ndefData = &type->data.wlcCapability; + + if (begin == true) + { + item = 0; + } + + /* Prepare bufItem->length: Each field is 1 byte, except when complete */ + bufItem->length = sizeof(uint8_t); + + switch (item) + { + case 0: /* WLC Protocol Version */ + bufItem->buffer = &ndefData->wlcProtocolVersion; + break; + case 1: /* WLC Config */ + { + temp = + ((ndefData->wlcConfigModeReq & NDEF_WLC_CAPABILITY_CONFIG_MODE_REQ_MASK) << NDEF_WLC_CAPABILITY_CONFIG_MODE_REQ_SHIFT) + | ((ndefData->wlcConfigWaitTimeRetry & NDEF_WLC_CAPABILITY_CONFIG_WAIT_TIME_RETRY_MASK) << NDEF_WLC_CAPABILITY_CONFIG_WAIT_TIME_RETRY_SHIFT) + | ((ndefData->wlcConfigNegoWait & NDEF_WLC_CAPABILITY_CONFIG_NEGO_WAIT_MASK) << NDEF_WLC_CAPABILITY_CONFIG_NEGO_WAIT_SHIFT) + | ((ndefData->wlcConfigRdConf & NDEF_WLC_CAPABILITY_CONFIG_RD_CONF_MASK) << NDEF_WLC_CAPABILITY_CONFIG_RD_CONF_SHIFT); + + bufItem->buffer = &temp; + break; + } + case 2: /* Cap Wt Int */ + temp = + ((ndefData->capWtIntRfu & NDEF_WLC_CAPABILITY_CONFIG_CAP_WT_INT_RFU_MASK) << NDEF_WLC_CAPABILITY_CONFIG_CAP_WT_INT_RFU_SHIFT) + | ((ndefData->capWtInt & NDEF_WLC_CAPABILITY_CONFIG_CAP_WT_INT_MASK) << NDEF_WLC_CAPABILITY_CONFIG_CAP_WT_INT_SHIFT); + + bufItem->buffer = &temp; + break; + case 3: /* NDEF Rd Wt */ + bufItem->buffer = &ndefData->ndefRdWt; + break; + case 4: /* NDEF Write To Int */ + bufItem->buffer = &ndefData->ndefWriteToInt; + break; + case 5: /* NDEF Write Wt Int */ + bufItem->buffer = &ndefData->ndefWriteWtInt; + break; + default: + bufItem->buffer = NULL; + bufItem->length = 0; + break; + } + + /* Move to next item for next call */ + item++; + + return bufItem->buffer; +} + + +/*****************************************************************************/ +ndefStatus ndefRtdWlcCapabilityInit(ndefType* type, const ndefTypeRtdWlcCapability* param) +{ + ndefTypeRtdWlcCapability* ndefData; + + if ( (type == NULL) || (param == NULL) ) + { + return ERR_PARAM; + } + + type->id = NDEF_TYPE_ID_RTD_WLCCAP; + type->getPayloadLength = ndefRtdWlcCapabilityGetPayloadLength; + type->getPayloadItem = ndefRtdWlcCapabilityGetPayloadItem; + type->typeToRecord = ndefRtdWlcCapabilityToRecord; + ndefData = &type->data.wlcCapability; + + (void)ST_MEMCPY(ndefData, param, sizeof(ndefTypeRtdWlcCapability)); + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefGetRtdWlcCapability(const ndefType* type, ndefTypeRtdWlcCapability* param) +{ + const ndefTypeRtdWlcCapability* ndefData; + + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_WLCCAP) || + (param == NULL) ) + { + return ERR_PARAM; + } + + ndefData = &type->data.wlcCapability; + + (void)ST_MEMCPY(param, ndefData, sizeof(ndefTypeRtdWlcCapability)); + + return ERR_NONE; +} + + +/*****************************************************************************/ +static ndefStatus ndefPayloadToRtdWlcCapability(const ndefConstBuffer* bufPayload, ndefType* type) +{ + ndefTypeRtdWlcCapability* ndefData; + + if ( (bufPayload == NULL) || (bufPayload->buffer == NULL) || + (type == NULL) ) + { + return ERR_PARAM; + } + + /* WLC TS v2.0 11.1.1.1 Any additional bytes inside an NDEF Record defined in this specification SHALL be ignored by the receiver.*/ + if (bufPayload->length < NDEF_TYPE_RTD_WLC_PAYLOAD_LENGTH) + { + return ERR_PROTO; + } + + type->id = NDEF_TYPE_ID_RTD_WLCCAP; + type->getPayloadLength = ndefRtdWlcCapabilityGetPayloadLength; + type->getPayloadItem = ndefRtdWlcCapabilityGetPayloadItem; + type->typeToRecord = ndefRtdWlcCapabilityToRecord; + ndefData = &type->data.wlcCapability; + + ndefData->wlcProtocolVersion = bufPayload->buffer[NDEF_WLC_CAPABILITY_PROTOCOL_VERSION_OFFSET]; + + uint8_t config = bufPayload->buffer[NDEF_WLC_CAPABILITY_CONFIG_OFFSET]; + ndefData->wlcConfigModeReq = (config >> NDEF_WLC_CAPABILITY_CONFIG_MODE_REQ_SHIFT) & NDEF_WLC_CAPABILITY_CONFIG_MODE_REQ_MASK; + ndefData->wlcConfigWaitTimeRetry = (config >> NDEF_WLC_CAPABILITY_CONFIG_WAIT_TIME_RETRY_SHIFT) & NDEF_WLC_CAPABILITY_CONFIG_WAIT_TIME_RETRY_MASK; + ndefData->wlcConfigNegoWait = (config >> NDEF_WLC_CAPABILITY_CONFIG_NEGO_WAIT_SHIFT) & NDEF_WLC_CAPABILITY_CONFIG_NEGO_WAIT_MASK; + ndefData->wlcConfigRdConf = (config >> NDEF_WLC_CAPABILITY_CONFIG_RD_CONF_SHIFT) & NDEF_WLC_CAPABILITY_CONFIG_RD_CONF_MASK; + + uint8_t capWtInt = bufPayload->buffer[NDEF_WLC_CAPABILITY_WT_INT_OFFSET]; + ndefData->capWtIntRfu = (capWtInt >> NDEF_WLC_CAPABILITY_CONFIG_CAP_WT_INT_RFU_SHIFT) & NDEF_WLC_CAPABILITY_CONFIG_CAP_WT_INT_RFU_MASK; + ndefData->capWtInt = (capWtInt >> NDEF_WLC_CAPABILITY_CONFIG_CAP_WT_INT_SHIFT) & NDEF_WLC_CAPABILITY_CONFIG_CAP_WT_INT_MASK; + ndefData->ndefRdWt = bufPayload->buffer[NDEF_WLC_CAPABILITY_NDEF_RD_WT_OFFSET]; + ndefData->ndefWriteToInt = bufPayload->buffer[NDEF_WLC_CAPABILITY_NDEF_WR_TO_INT_OFFSET]; + ndefData->ndefWriteWtInt = bufPayload->buffer[NDEF_WLC_CAPABILITY_NDEF_WR_WT_INT_OFFSET]; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordToRtdWlcCapability(const ndefRecord* record, ndefType* type) +{ + const ndefType* ndefData; + + if ( (record == NULL) || (type == NULL) ) + { + return ERR_PARAM; + } + + /* NDEF TNF and String type */ + if ( ! ndefRecordTypeMatch(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufTypeRtdWlcCapability)) + { + return ERR_PROTO; + } + + ndefData = ndefRecordGetNdefType(record); + if ( (ndefData != NULL) && (ndefData->id == NDEF_TYPE_ID_RTD_WLCCAP) ) + { + (void)ST_MEMCPY(type, ndefData, sizeof(ndefType)); + return ERR_NONE; + } + + return ndefPayloadToRtdWlcCapability(&record->bufPayload, type); +} + + +/*****************************************************************************/ +ndefStatus ndefRtdWlcCapabilityToRecord(const ndefType* type, ndefRecord* record) +{ + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_WLCCAP) || + (record == NULL) ) + { + return ERR_PARAM; + } + + (void)ndefRecordReset(record); + + /* String type */ + (void)ndefRecordSetType(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufTypeRtdWlcCapability); + + if (ndefRecordSetNdefType(record, type) != ERR_NONE) + { + return ERR_PARAM; + } + + return ERR_NONE; +} + + +/*****************************************************************************/ +/* + * WLC Status and Information + */ +/*****************************************************************************/ + + +/*****************************************************************************/ +static uint32_t ndefRtdWlcStatusInfoGetPayloadLength(const ndefType* type) +{ + uint32_t length; + + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_WLCSTAI) ) + { + return 0; + } + + const ndefTypeRtdWlcStatusInfo* ndefData = &type->data.wlcStatusInfo; + + length = sizeof(uint8_t); /* Control byte 1 */ + + /* Count the number of bits set in the Control byte 1 to get the number of following bytes */ + for (uint32_t i = 0; i < 8U; i++) + { + if ( (ndefData->controlByte1 & (1U << i) ) != 0U) + { + length += sizeof(uint8_t); + } + } + + return length; +} + + +/*****************************************************************************/ +static const uint8_t* ndefRtdWlcStatusInfoGetPayloadItem(const ndefType* type, ndefConstBuffer* bufItem, bool begin) +{ + static uint32_t item = 0; + const ndefTypeRtdWlcStatusInfo* ndefData; + + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_WLCSTAI) || + (bufItem == NULL) ) + { + return NULL; + } + + ndefData = &type->data.wlcStatusInfo; + + if (begin == true) + { + item = 0; + } + + /* Prepare bufItem->length: Each field is 1 byte, except when complete */ + bufItem->length = sizeof(uint8_t); + + switch (item) + { + case 0: /* Control Byte 1 */ + bufItem->buffer = &ndefData->controlByte1; + item++; + break; + case 1: /* Battery Level */ + if ( (ndefData->controlByte1 & NDEF_WLC_STATUSINFO_CONTROLBYTE1_BATTERY_LEVEL_MASK) != 0U) + { + bufItem->buffer = &ndefData->batteryLevel; + item = 2; + break; + } + /* fall through */ + case 2: /* Receive Power */ + if ( (ndefData->controlByte1 & NDEF_WLC_STATUSINFO_CONTROLBYTE1_RECEIVE_POWER_MASK) != 0U) + { + bufItem->buffer = &ndefData->receivePower; + item = 3; + break; + } + /* fall through */ + case 3: /* Receive Voltage */ + if ( (ndefData->controlByte1 & NDEF_WLC_STATUSINFO_CONTROLBYTE1_RECEIVE_VOLTAGE_MASK) != 0U) + { + bufItem->buffer = &ndefData->receiveVoltage; + item = 4; + break; + } + /* fall through */ + case 4: /* Receive Current */ + if ( (ndefData->controlByte1 & NDEF_WLC_STATUSINFO_CONTROLBYTE1_RECEIVE_CURRENT_MASK) != 0U) + { + bufItem->buffer = &ndefData->receiveCurrent; + item = 5; + break; + } + /* fall through */ + case 5: /* Receive Current */ + if ( (ndefData->controlByte1 & NDEF_WLC_STATUSINFO_CONTROLBYTE1_TEMPERATURE_BATTERY_MASK) != 0U) + { + bufItem->buffer = &ndefData->temperatureBattery; + item = 6; + break; + } + /* fall through */ + case 6: /* Receive Current */ + if ( (ndefData->controlByte1 & NDEF_WLC_STATUSINFO_CONTROLBYTE1_TEMPERATURE_WLCL_MASK) != 0U) + { + bufItem->buffer = &ndefData->temperatureWlcl; + item = 7; + break; + } + /* fall through */ + case 7: /* Receive Current */ + if ( (ndefData->controlByte1 & NDEF_WLC_STATUSINFO_CONTROLBYTE1_RFU_MASK) != 0U) + { + bufItem->buffer = &ndefData->rfu; + item = 8; + break; + } + /* fall through */ + case 8: /* Receive Current */ + if ( (ndefData->controlByte1 & NDEF_WLC_STATUSINFO_CONTROLBYTE1_CONTROL_BYTE_2_MASK) != 0U) + { + bufItem->buffer = &ndefData->controlByte2; + item = 9; + break; + } + /* fall through */ + default: /* PRQA S 2003 # MISRA 16.3 - Intentional fall through */ + bufItem->buffer = NULL; + bufItem->length = 0; + break; + } + + return bufItem->buffer; +} + + +/*****************************************************************************/ +ndefStatus ndefRtdWlcStatusInfoInit(ndefType* type, const ndefTypeRtdWlcStatusInfo* param) +{ + ndefTypeRtdWlcStatusInfo* ndefData; + + if ( (type == NULL) || (param == NULL) ) + { + return ERR_PARAM; + } + + type->id = NDEF_TYPE_ID_RTD_WLCSTAI; + type->getPayloadLength = ndefRtdWlcStatusInfoGetPayloadLength; + type->getPayloadItem = ndefRtdWlcStatusInfoGetPayloadItem; + type->typeToRecord = ndefRtdWlcStatusInfoToRecord; + ndefData = &type->data.wlcStatusInfo; + + (void)ST_MEMCPY(ndefData, param, sizeof(ndefTypeRtdWlcStatusInfo)); + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefGetRtdWlcStatusInfo(const ndefType* type, ndefTypeRtdWlcStatusInfo* param) +{ + const ndefTypeRtdWlcStatusInfo* ndefData; + + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_WLCSTAI) || + (param == NULL) ) + { + return ERR_PARAM; + } + + ndefData = &type->data.wlcStatusInfo; + + (void)ST_MEMCPY(param, ndefData, sizeof(ndefTypeRtdWlcStatusInfo)); + + return ERR_NONE; +} + + +/*****************************************************************************/ +static ndefStatus ndefPayloadToRtdWlcStatusInfo(const ndefConstBuffer* bufPayload, ndefType* type) +{ + ndefTypeRtdWlcStatusInfo* ndefData; + + if ( (bufPayload == NULL) || (bufPayload->buffer == NULL) || + (type == NULL) ) + { + return ERR_PARAM; + } + + /* WLC TS v2.0 11.1.1.1 Any additional bytes inside an NDEF Record defined in this specification SHALL be ignored by the receiver.*/ + if ( (bufPayload->length < NDEF_TYPE_RTD_WLC_STATUS_INFO_MIN_PAYLOAD_LENGTH) ) + { + return ERR_PROTO; + } + + type->id = NDEF_TYPE_ID_RTD_WLCSTAI; + type->getPayloadLength = ndefRtdWlcStatusInfoGetPayloadLength; + type->getPayloadItem = ndefRtdWlcStatusInfoGetPayloadItem; + type->typeToRecord = ndefRtdWlcStatusInfoToRecord; + ndefData = &type->data.wlcStatusInfo; + + uint32_t offset = NDEF_WLC_STATUSINFO_CONTROL_BYTE_1_OFFSET; + + uint8_t controlByte1 = bufPayload->buffer[offset]; + offset++; + + /* Initialize each field */ + ndefData->controlByte1 = controlByte1; + ndefData->batteryLevel = 0; + ndefData->receivePower = 0; + ndefData->receiveVoltage = 0; + ndefData->receiveCurrent = 0; + ndefData->temperatureBattery = 0; + ndefData->temperatureWlcl = 0; + ndefData->rfu = 0; + ndefData->controlByte2 = 0; + + /* Check each bit in Control byte 1 and read the appropriate byte */ + if ( (controlByte1 & NDEF_WLC_STATUSINFO_CONTROLBYTE1_BATTERY_LEVEL_MASK) != 0U) + { + ndefData->batteryLevel = bufPayload->buffer[offset]; + offset++; + } + + if ( (controlByte1 & NDEF_WLC_STATUSINFO_CONTROLBYTE1_RECEIVE_POWER_MASK) != 0U) + { + ndefData->receivePower = bufPayload->buffer[offset]; + offset++; + } + + if ( (controlByte1 & NDEF_WLC_STATUSINFO_CONTROLBYTE1_RECEIVE_VOLTAGE_MASK) != 0U) + { + ndefData->receiveVoltage = bufPayload->buffer[offset]; + offset++; + } + + if ( (controlByte1 & NDEF_WLC_STATUSINFO_CONTROLBYTE1_RECEIVE_CURRENT_MASK) != 0U) + { + ndefData->receiveCurrent = bufPayload->buffer[offset]; + offset++; + } + + if ( (controlByte1 & NDEF_WLC_STATUSINFO_CONTROLBYTE1_TEMPERATURE_BATTERY_MASK) != 0U) + { + ndefData->temperatureBattery = bufPayload->buffer[offset]; + offset++; + } + + if ( (controlByte1 & NDEF_WLC_STATUSINFO_CONTROLBYTE1_TEMPERATURE_WLCL_MASK) != 0U) + { + ndefData->temperatureWlcl = bufPayload->buffer[offset]; + offset++; + } + + if ( (controlByte1 & NDEF_WLC_STATUSINFO_CONTROLBYTE1_RFU_MASK) != 0U) + { + ndefData->rfu = bufPayload->buffer[offset]; + offset++; + } + + if ( (controlByte1 & NDEF_WLC_STATUSINFO_CONTROLBYTE1_CONTROL_BYTE_2_MASK) != 0U) + { + ndefData->controlByte2 = bufPayload->buffer[offset]; + /*offset++;*/ + } + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordToRtdWlcStatusInfo(const ndefRecord* record, ndefType* type) +{ + const ndefType* ndefData; + + if ( (record == NULL) || (type == NULL) ) + { + return ERR_PARAM; + } + + /* NDEF TNF and String type */ + if ( ! ndefRecordTypeMatch(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufTypeRtdWlcStatusInfo)) + { + return ERR_PROTO; + } + + ndefData = ndefRecordGetNdefType(record); + if ( (ndefData != NULL) && (ndefData->id == NDEF_TYPE_ID_RTD_WLCSTAI) ) + { + (void)ST_MEMCPY(type, ndefData, sizeof(ndefType)); + return ERR_NONE; + } + + return ndefPayloadToRtdWlcStatusInfo(&record->bufPayload, type); +} + + +/*****************************************************************************/ +ndefStatus ndefRtdWlcStatusInfoToRecord(const ndefType* type, ndefRecord* record) +{ + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_WLCSTAI) || + (record == NULL) ) + { + return ERR_PARAM; + } + + (void)ndefRecordReset(record); + + /* String type */ + (void)ndefRecordSetType(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufTypeRtdWlcStatusInfo); + + if (ndefRecordSetNdefType(record, type) != ERR_NONE) + { + return ERR_PARAM; + } + + return ERR_NONE; +} + + +/*****************************************************************************/ +/* + * WLC Poll Information + */ +/*****************************************************************************/ + + +/*****************************************************************************/ +static uint32_t ndefRtdWlcPollInfoGetPayloadLength(const ndefType* type) +{ + if ( (type == NULL) || ((type)->id != NDEF_TYPE_ID_RTD_WLCINFO) ) + { + return 0; + } + + return NDEF_TYPE_RTD_WLC_PAYLOAD_LENGTH; +} + + +/*****************************************************************************/ +static const uint8_t* ndefRtdWlcPollInfoGetPayloadItem(const ndefType* type, ndefConstBuffer* bufItem, bool begin) +{ + static uint32_t item = 0; + const ndefTypeRtdWlcPollInfo* ndefData; + + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_WLCINFO) || + (bufItem == NULL) ) + { + return NULL; + } + + ndefData = &type->data.wlcPollInfo; + + if (begin == true) + { + item = 0; + } + + /* Prepare bufItem->length: Each field is 1 byte, except when complete */ + bufItem->length = sizeof(uint8_t); + + switch (item) + { + case 0: /* P Tx */ + bufItem->buffer = &ndefData->pTx; + break; + case 1: /* WLC-P Capability | Power class */ + { + static uint8_t temp; + temp = + ((ndefData->wlcPCap << NDEF_WLC_POLL_INFO_WLC_P_CAPABILITY_SHIFT) + | ((ndefData->powerClass & NDEF_WLC_POLL_INFO_WLC_P_CAPABILITY_MASK))); + + bufItem->buffer = &temp; + break; + } + case 2: /* Total Power Steps */ + bufItem->buffer = &ndefData->totPowerSteps; + break; + case 3: /* Current Power Steps */ + bufItem->buffer = &ndefData->curPowerStep; + break; + case 4: /* Next min step increment */ + bufItem->buffer = &ndefData->nextMinStepInc; + break; + case 5: /* Next min step decrement */ + bufItem->buffer = &ndefData->nextMinStepDec; + break; + default: + bufItem->buffer = NULL; + bufItem->length = 0; + break; + } + + /* Move to next item for next call */ + item++; + + return bufItem->buffer; +} + + +/*****************************************************************************/ +ndefStatus ndefRtdWlcPollInfoInit(ndefType* type, const ndefTypeRtdWlcPollInfo* param) +{ + ndefTypeRtdWlcPollInfo* ndefData; + + if ( (type == NULL) || (param == NULL) ) + { + return ERR_PARAM; + } + + type->id = NDEF_TYPE_ID_RTD_WLCINFO; + type->getPayloadLength = ndefRtdWlcPollInfoGetPayloadLength; + type->getPayloadItem = ndefRtdWlcPollInfoGetPayloadItem; + type->typeToRecord = ndefRtdWlcPollInfoToRecord; + ndefData = &type->data.wlcPollInfo; + + (void)ST_MEMCPY(ndefData, param, sizeof(ndefTypeRtdWlcPollInfo)); + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefGetRtdWlcPollInfo(const ndefType* type, ndefTypeRtdWlcPollInfo* param) +{ + const ndefTypeRtdWlcPollInfo* ndefData; + + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_WLCINFO) || + (param == NULL) ) + { + return ERR_PARAM; + } + + ndefData = &type->data.wlcPollInfo; + + (void)ST_MEMCPY(param, ndefData, sizeof(ndefTypeRtdWlcPollInfo)); + + return ERR_NONE; +} + + +/*****************************************************************************/ +static ndefStatus ndefPayloadToRtdWlcPollInfo(const ndefConstBuffer* bufPayload, ndefType* type) +{ + ndefTypeRtdWlcPollInfo* ndefData; + + if ( (bufPayload == NULL) || (bufPayload->buffer == NULL) || + (type == NULL) ) + { + return ERR_PARAM; + } + + /* WLC TS v2.0 11.1.1.1 Any additional bytes inside an NDEF Record defined in this specification SHALL be ignored by the receiver.*/ + if (bufPayload->length < NDEF_TYPE_RTD_WLC_PAYLOAD_LENGTH) + { + return ERR_PROTO; + } + + type->id = NDEF_TYPE_ID_RTD_WLCINFO; + type->getPayloadLength = ndefRtdWlcPollInfoGetPayloadLength; + type->getPayloadItem = ndefRtdWlcPollInfoGetPayloadItem; + type->typeToRecord = ndefRtdWlcPollInfoToRecord; + ndefData = &type->data.wlcPollInfo; + + ndefData->pTx = bufPayload->buffer[NDEF_WLC_POLL_INFO_PTX_OFFSET]; + ndefData->wlcPCap = bufPayload->buffer[NDEF_WLC_POLL_INFO_WLC_P_CAPABILITY_OFFSET] >> NDEF_WLC_POLL_INFO_WLC_P_CAPABILITY_SHIFT; + ndefData->powerClass = bufPayload->buffer[NDEF_WLC_POLL_INFO_POWER_CLASS_OFFSET] & NDEF_WLC_POLL_INFO_WLC_P_CAPABILITY_MASK; + ndefData->totPowerSteps = bufPayload->buffer[NDEF_WLC_POLL_INFO_TOT_POWER_STEPS_OFFSET]; + ndefData->curPowerStep = bufPayload->buffer[NDEF_WLC_POLL_INFO_CUR_POWER_STEP_OFFSET]; + ndefData->nextMinStepInc = bufPayload->buffer[NDEF_WLC_POLL_INFO_NEXT_MIN_STEP_INC_OFFSET]; + ndefData->nextMinStepDec = bufPayload->buffer[NDEF_WLC_POLL_INFO_NEXT_MIN_STEP_DEC_OFFSET]; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordToRtdWlcPollInfo(const ndefRecord* record, ndefType* type) +{ + const ndefType* ndefData; + + if ( (record == NULL) || (type == NULL) ) + { + return ERR_PARAM; + } + + /* NDEF TNF and String type */ + if ( ! ndefRecordTypeMatch(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufTypeRtdWlcPollInfo)) + { + return ERR_PROTO; + } + + ndefData = ndefRecordGetNdefType(record); + if ( (ndefData != NULL) && (ndefData->id == NDEF_TYPE_ID_RTD_WLCINFO) ) + { + (void)ST_MEMCPY(type, ndefData, sizeof(ndefType)); + return ERR_NONE; + } + + return ndefPayloadToRtdWlcPollInfo(&record->bufPayload, type); +} + + +/*****************************************************************************/ +ndefStatus ndefRtdWlcPollInfoToRecord(const ndefType* type, ndefRecord* record) +{ + if ( (type == NULL) || ((type)->id != NDEF_TYPE_ID_RTD_WLCINFO) || + (record == NULL) ) + { + return ERR_PARAM; + } + + (void)ndefRecordReset(record); + + /* String type */ + (void)ndefRecordSetType(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufTypeRtdWlcPollInfo); + + if (ndefRecordSetNdefType(record, type) != ERR_NONE) + { + return ERR_PARAM; + } + + return ERR_NONE; +} + + +/*****************************************************************************/ +/* + * WLC Listen Control + */ +/*****************************************************************************/ + + +/*****************************************************************************/ +static uint32_t ndefRtdWlcListenCtlGetPayloadLength(const ndefType* type) +{ + const ndefTypeRtdWlcListenCtl* ndefData; + uint32_t payloadLength; + + if ( (type == NULL) || ((type)->id != NDEF_TYPE_ID_RTD_WLCCTL) ) + { + return 0; + } + + ndefData = &type->data.wlcListenCtl; + + payloadLength = NDEF_TYPE_RTD_WLC_PAYLOAD_LENGTH; + /* Check for optional last ERROR_INFO byte */ + payloadLength += ((ndefData->statusInfoErrorFlag != 0U) ? 1U : 0U); + + return payloadLength; +} + + +/*****************************************************************************/ +static const uint8_t* ndefRtdWlcListenCtlGetPayloadItem(const ndefType* type, ndefConstBuffer* bufItem, bool begin) +{ + static uint32_t item = 0; + static uint8_t temp = 0; + const ndefTypeRtdWlcListenCtl* ndefData; + + if ( (type == NULL) || ((type)->id != NDEF_TYPE_ID_RTD_WLCCTL) || + (bufItem == NULL) ) + { + return NULL; + } + + ndefData = &type->data.wlcListenCtl; + + if (begin == true) + { + item = 0; + } + + /* Prepare bufItem->length: Each field is 1 byte, except when complete */ + bufItem->length = sizeof(uint8_t); + + switch (item) + { + case 0: /* Status Info */ + { + temp = + ((ndefData->statusInfoErrorFlag & NDEF_WLC_LISTEN_CTL_STATUS_INFO_ERROR_MASK) << NDEF_WLC_LISTEN_CTL_STATUS_INFO_ERROR_SHIFT) + | ((ndefData->statusInfoBatteryStatus & NDEF_WLC_LISTEN_CTL_STATUS_INFO_BATTERY_MASK) << NDEF_WLC_LISTEN_CTL_STATUS_INFO_BATTERY_SHIFT) + | ((ndefData->statusInfoCnt & NDEF_WLC_LISTEN_CTL_STATUS_INFO_COUNTER_MASK) << NDEF_WLC_LISTEN_CTL_STATUS_INFO_COUNTER_SHIFT); + + bufItem->buffer = &temp; + break; + } + case 1: /* WPT Config */ + temp = + ((ndefData->wptConfigWptReq & NDEF_WLC_LISTEN_CTL_WPT_CONFIG_REQ_MASK) << NDEF_WLC_LISTEN_CTL_WPT_CONFIG_REQ_SHIFT) + | ((ndefData->wptConfigWptDuration & NDEF_WLC_LISTEN_CTL_WPT_CONFIG_DURATION_MASK) << NDEF_WLC_LISTEN_CTL_WPT_CONFIG_DURATION_SHIFT) + | ((ndefData->wptConfigInfoReq & NDEF_WLC_LISTEN_CTL_WPT_CONFIG_INFO_REQ_MASK) << NDEF_WLC_LISTEN_CTL_WPT_CONFIG_INFO_REQ_SHIFT); + + bufItem->buffer = &temp; + break; + case 2: /* Power Adjust Request */ + bufItem->buffer = &ndefData->powerAdjReq; + break; + case 3: /* Battery Level */ + bufItem->buffer = &ndefData->batteryLevel; + break; + case 4: /* Drv Info */ + { + temp = + ((ndefData->drvInfoFlag & NDEF_WLC_LISTEN_CTL_DRV_INFO_FLAG_MASK) << NDEF_WLC_LISTEN_CTL_DRV_INFO_FLAG_SHIFT) + | ((ndefData->drvInfoInt & NDEF_WLC_LISTEN_CTL_DRV_INFO_INT_MASK) << NDEF_WLC_LISTEN_CTL_DRV_INFO_INT_SHIFT); + + bufItem->buffer = &temp; + break; + } + case 5: /* Hold Off Wt Int */ + bufItem->buffer = &ndefData->holdOffWtInt; + break; + case 6: /* Optional last ERROR_INFO byte */ + if (ndefData->statusInfoErrorFlag != 0U) + { + /* Send the ERROR_INFO byte */ + temp = + ((ndefData->errorInfoError & NDEF_WLC_LISTEN_CTL_ERROR_INFO_PROTOCOL_MASK) << NDEF_WLC_LISTEN_CTL_ERROR_INFO_PROTOCOL_SHIFT) + | ((ndefData->errorInfoTemperature & NDEF_WLC_LISTEN_CTL_ERROR_INFO_TEMPERATURE_MASK) << NDEF_WLC_LISTEN_CTL_ERROR_INFO_TEMPERATURE_SHIFT); + + bufItem->buffer = &temp; + break; + } + /* if no ERR_INFO byte to send */ + /* fall through */ + default: /* PRQA S 2003 # MISRA 16.3 - Intentional fall through */ + bufItem->buffer = NULL; + bufItem->length = 0; + break; + } + + /* Move to next item for next call */ + item++; + + return bufItem->buffer; +} + + +/*****************************************************************************/ +ndefStatus ndefRtdWlcListenCtlInit(ndefType* type, const ndefTypeRtdWlcListenCtl* param) +{ + ndefTypeRtdWlcListenCtl* ndefData; + + if ( (type == NULL) || (param == NULL) ) + { + return ERR_PARAM; + } + + type->id = NDEF_TYPE_ID_RTD_WLCCTL; + type->getPayloadLength = ndefRtdWlcListenCtlGetPayloadLength; + type->getPayloadItem = ndefRtdWlcListenCtlGetPayloadItem; + type->typeToRecord = ndefRtdWlcListenCtlToRecord; + ndefData = &type->data.wlcListenCtl; + + (void)ST_MEMCPY(ndefData, param, sizeof(ndefTypeRtdWlcListenCtl)); + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefGetRtdWlcListenCtl(const ndefType* type, ndefTypeRtdWlcListenCtl* param) +{ + const ndefTypeRtdWlcListenCtl* ndefData; + + if ( (type == NULL) || (type->id != NDEF_TYPE_ID_RTD_WLCCTL) || + (param == NULL) ) + { + return ERR_PARAM; + } + + ndefData = &type->data.wlcListenCtl; + + (void)ST_MEMCPY(param, ndefData, sizeof(ndefTypeRtdWlcListenCtl)); + + return ERR_NONE; +} + + +/*****************************************************************************/ +static ndefStatus ndefPayloadToRtdWlcListenCtl(const ndefConstBuffer* bufPayload, ndefType* type) +{ + ndefTypeRtdWlcListenCtl* ndefData; + + if ( (bufPayload == NULL) || (bufPayload->buffer == NULL) || + (type == NULL) ) + { + return ERR_PARAM; + } + + if (bufPayload->length < NDEF_TYPE_RTD_WLC_PAYLOAD_LENGTH) + { + return ERR_PROTO; + } + + type->id = NDEF_TYPE_ID_RTD_WLCCTL; + type->getPayloadLength = ndefRtdWlcListenCtlGetPayloadLength; + type->getPayloadItem = ndefRtdWlcListenCtlGetPayloadItem; + type->typeToRecord = ndefRtdWlcListenCtlToRecord; + ndefData = &type->data.wlcListenCtl; + + uint8_t status = bufPayload->buffer[NDEF_WLC_LISTEN_CTL_STATUS_INFO_OFFSET]; + ndefData->statusInfoErrorFlag = (status >> NDEF_WLC_LISTEN_CTL_STATUS_INFO_ERROR_SHIFT) & NDEF_WLC_LISTEN_CTL_STATUS_INFO_ERROR_MASK; + ndefData->statusInfoBatteryStatus = (status >> NDEF_WLC_LISTEN_CTL_STATUS_INFO_BATTERY_SHIFT) & NDEF_WLC_LISTEN_CTL_STATUS_INFO_BATTERY_MASK; + ndefData->statusInfoCnt = (status >> NDEF_WLC_LISTEN_CTL_STATUS_INFO_COUNTER_SHIFT) & NDEF_WLC_LISTEN_CTL_STATUS_INFO_COUNTER_MASK; + + uint8_t config = bufPayload->buffer[NDEF_WLC_LISTEN_CTL_WPT_CONFIG_OFFSET]; + ndefData->wptConfigWptReq = (config >> NDEF_WLC_LISTEN_CTL_WPT_CONFIG_REQ_SHIFT) & NDEF_WLC_LISTEN_CTL_WPT_CONFIG_REQ_MASK; + ndefData->wptConfigWptDuration = (config >> NDEF_WLC_LISTEN_CTL_WPT_CONFIG_DURATION_SHIFT) & NDEF_WLC_LISTEN_CTL_WPT_CONFIG_DURATION_MASK; + ndefData->wptConfigInfoReq = (config >> NDEF_WLC_LISTEN_CTL_WPT_CONFIG_INFO_REQ_SHIFT) & NDEF_WLC_LISTEN_CTL_WPT_CONFIG_INFO_REQ_MASK; + + ndefData->powerAdjReq = bufPayload->buffer[NDEF_WLC_LISTEN_CTL_POWER_ADJ_REQ_OFFSET]; + ndefData->batteryLevel = bufPayload->buffer[NDEF_WLC_LISTEN_CTL_BATTERY_LEVEL_OFFSET]; + + uint8_t drvInfo = bufPayload->buffer[NDEF_WLC_LISTEN_CTL_DRV_INFO_OFFSET]; + ndefData->drvInfoFlag = (drvInfo >> NDEF_WLC_LISTEN_CTL_DRV_INFO_FLAG_SHIFT) & NDEF_WLC_LISTEN_CTL_DRV_INFO_FLAG_MASK; + ndefData->drvInfoInt = (drvInfo >> NDEF_WLC_LISTEN_CTL_DRV_INFO_INT_SHIFT) & NDEF_WLC_LISTEN_CTL_DRV_INFO_INT_MASK; + + ndefData->holdOffWtInt = bufPayload->buffer[NDEF_WLC_LISTEN_CTL_HOLD_OFF_WT_INT_OFFSET]; + + uint8_t error = 0; + if (ndefData->statusInfoErrorFlag != 0U) + { + if (bufPayload->length < (NDEF_TYPE_RTD_WLC_PAYLOAD_LENGTH + 1U)) + { + return ERR_PROTO; + } + error = bufPayload->buffer[NDEF_WLC_LISTEN_CTL_ERROR_INFO_OFFSET]; + } + ndefData->errorInfoError = (error >> NDEF_WLC_LISTEN_CTL_ERROR_INFO_PROTOCOL_SHIFT) & NDEF_WLC_LISTEN_CTL_ERROR_INFO_PROTOCOL_MASK; + ndefData->errorInfoTemperature = (error >> NDEF_WLC_LISTEN_CTL_ERROR_INFO_TEMPERATURE_SHIFT) & NDEF_WLC_LISTEN_CTL_ERROR_INFO_TEMPERATURE_MASK; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordToRtdWlcListenCtl(const ndefRecord* record, ndefType* type) +{ + const ndefType* ndefData; + + if ( (record == NULL) || (type == NULL) ) + { + return ERR_PARAM; + } + + /* NDEF TNF and String type */ + if ( ! ndefRecordTypeMatch(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufTypeRtdWlcListenCtl)) + { + return ERR_PROTO; + } + + ndefData = ndefRecordGetNdefType(record); + if ( (ndefData != NULL) && (ndefData->id == NDEF_TYPE_ID_RTD_WLCCTL) ) + { + (void)ST_MEMCPY(type, ndefData, sizeof(ndefType)); + return ERR_NONE; + } + + return ndefPayloadToRtdWlcListenCtl(&record->bufPayload, type); +} + + +/*****************************************************************************/ +ndefStatus ndefRtdWlcListenCtlToRecord(const ndefType* type, ndefRecord* record) +{ + if ( (type == NULL) || ((type)->id != NDEF_TYPE_ID_RTD_WLCCTL) || + (record == NULL) ) + { + return ERR_PARAM; + } + + (void)ndefRecordReset(record); + + /* String type */ + (void)ndefRecordSetType(record, NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufTypeRtdWlcListenCtl); + + if (ndefRecordSetNdefType(record, type) != ERR_NONE) + { + return ERR_PARAM; + } + + return ERR_NONE; +} + +#endif diff --git a/components/spi-st25r3911b/NDEF/source/message/ndef_type_wpcwlc.c b/components/spi-st25r3911b/NDEF/source/message/ndef_type_wpcwlc.c new file mode 100644 index 0000000..30109bb --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/message/ndef_type_wpcwlc.c @@ -0,0 +1,224 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF RTD RTD Wireless Power Consortium WLC Record (WPCWLC) type + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_types.h" +#include "ndef_type_wpcwlc.h" +#include "utils.h" + + +#if NDEF_TYPE_RTD_WPCWLC_SUPPORT + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + + +/*! RTD Type strings */ +static const uint8_t ndefRtdTypeWptWlc[] = "www.wirelesspowerconsortium.com:wlc"; /*!< External Type (Wireless Power Consortium WLC Record) */ + +const ndefConstBuffer8 bufRtdTypeWpcWlc = { ndefRtdTypeWptWlc, sizeof(ndefRtdTypeWptWlc) - 1U }; /*!< WPCWLC External Type Record buffer */ + + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + + +/* + * NFC Forum External Type (Wireless Power Consortium WLC Record) + */ + + +/*****************************************************************************/ +static uint32_t ndefRtdWpcWlcPayloadGetLength(const ndefType* wpcWlc) +{ + const ndefTypeRtdWpcWlc* rtdWpcWlc; + + if ( (wpcWlc == NULL) || (wpcWlc->id != NDEF_TYPE_ID_RTD_WPCWLC) ) + { + return 0; + } + + rtdWpcWlc = &wpcWlc->data.wpcWlc; + + return rtdWpcWlc->bufPayload.length; +} + + +/*****************************************************************************/ +static const uint8_t* ndefRtdWpcWlcToPayloadItem(const ndefType* wpcWlc, ndefConstBuffer* bufItem, bool begin) +{ + static uint32_t item = 0; + const ndefTypeRtdWpcWlc* rtdWpcWlc; + + if ( (wpcWlc == NULL) || (wpcWlc->id != NDEF_TYPE_ID_RTD_WPCWLC) || + (bufItem == NULL) ) + { + return NULL; + } + + rtdWpcWlc = &wpcWlc->data.wpcWlc; + + if (begin == true) + { + item = 0; + } + + switch (item) + { + case 0: + /* Ki Payload */ + bufItem->buffer = rtdWpcWlc->bufPayload.buffer; + bufItem->length = rtdWpcWlc->bufPayload.length; + break; + + default: + bufItem->buffer = NULL; + bufItem->length = 0; + break; + } + + /* Move to next item for next call */ + item++; + + return bufItem->buffer; +} + + +/*****************************************************************************/ +ndefStatus ndefRtdWpcWlcInit(ndefType* wpcWlc, const ndefConstBuffer* bufPayload) +{ + ndefTypeRtdWpcWlc* rtdWpcWlc; + + if ( (wpcWlc == NULL) || (bufPayload == NULL) ) + { + return ERR_PARAM; + } + + wpcWlc->id = NDEF_TYPE_ID_RTD_WPCWLC; + wpcWlc->getPayloadLength = ndefRtdWpcWlcPayloadGetLength; + wpcWlc->getPayloadItem = ndefRtdWpcWlcToPayloadItem; + wpcWlc->typeToRecord = ndefRtdWpcWlcToRecord; + rtdWpcWlc = &wpcWlc->data.wpcWlc; + + rtdWpcWlc->bufPayload.buffer = bufPayload->buffer; + rtdWpcWlc->bufPayload.length = bufPayload->length; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefGetRtdWpcWlc(const ndefType* wpcWlc, ndefConstBuffer* bufWpcWlc) +{ + const ndefTypeRtdWpcWlc* rtdWpcWlc; + + if ( (wpcWlc == NULL) || (wpcWlc->id != NDEF_TYPE_ID_RTD_WPCWLC) || + (bufWpcWlc == NULL) ) + { + return ERR_PARAM; + } + + rtdWpcWlc = &wpcWlc->data.wpcWlc; + + bufWpcWlc->buffer = rtdWpcWlc->bufPayload.buffer; + bufWpcWlc->length = rtdWpcWlc->bufPayload.length; + + return ERR_NONE; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordToRtdWpcWlc(const ndefRecord* record, ndefType* wpcWlc) +{ + if ( (record == NULL) || (wpcWlc == NULL) ) + { + return ERR_PARAM; + } + + if ( ! ndefRecordTypeMatch(record, NDEF_TNF_RTD_EXTERNAL_TYPE, &bufRtdTypeWpcWlc)) /* "www.wirelesspowerconsortium.com:wlc" */ + { + return ERR_PROTO; + } + + /* No constraint on payload length */ + + return ndefRtdWpcWlcInit(wpcWlc, &record->bufPayload); +} + + +/*****************************************************************************/ +ndefStatus ndefRtdWpcWlcToRecord(const ndefType* wpcWlc, ndefRecord* record) +{ + if ( (wpcWlc == NULL) || (wpcWlc->id != NDEF_TYPE_ID_RTD_WPCWLC) || + (record == NULL) ) + { + return ERR_PARAM; + } + + (void)ndefRecordReset(record); + + /* "www.wirelesspowerconsortium.com:wlc" */ + (void)ndefRecordSetType(record, NDEF_TNF_RTD_EXTERNAL_TYPE, &bufRtdTypeWpcWlc); + + if (ndefRecordSetNdefType(record, wpcWlc) != ERR_NONE) + { + return ERR_PARAM; + } + + return ERR_NONE; +} + +#endif diff --git a/components/spi-st25r3911b/NDEF/source/message/ndef_types.c b/components/spi-st25r3911b/NDEF/source/message/ndef_types.c new file mode 100644 index 0000000..0187aa7 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/message/ndef_types.c @@ -0,0 +1,239 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief NDEF RTD and MIME types + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_record.h" +#include "ndef_types.h" +#include "utils.h" + + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + +/*! NDEF type table to associate a TNF, type and the recordToType function pointers */ +typedef struct +{ + uint8_t tnf; /*!< TNF */ + const ndefConstBuffer8* bufTypeString; /*!< Type String buffer */ + ndefStatus (*recordToType)(const ndefRecord* record, ndefType* type); /*!< Pointer to read function */ +} ndefTypeConverter; + + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + + +/*****************************************************************************/ +ndefStatus ndefRecordToType(const ndefRecord* record, ndefType* type) +{ +#if NDEF_TYPE_EMPTY_SUPPORT + /*! Empty string */ + static const uint8_t ndefTypeEmpty[] = ""; /*!< Empty string */ + static ndefConstBuffer8 bufTypeEmpty = { ndefTypeEmpty, sizeof(ndefTypeEmpty) - 1U }; +#endif + + /*! Array to match RTD strings with Well-known types, and converting functions */ + static const ndefTypeConverter typeConverterTable[] = + { +#if NDEF_TYPE_EMPTY_SUPPORT + { NDEF_TNF_EMPTY, &bufTypeEmpty, ndefRecordToEmptyType }, +#endif +#if NDEF_TYPE_RTD_DEVICE_INFO_SUPPORT + { NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufRtdTypeDeviceInfo, ndefRecordToRtdDeviceInfo }, +#endif +#if NDEF_TYPE_RTD_TEXT_SUPPORT + { NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufRtdTypeText, ndefRecordToRtdText }, +#endif +#if NDEF_TYPE_RTD_URI_SUPPORT + { NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufRtdTypeUri, ndefRecordToRtdUri }, +#endif +#if NDEF_TYPE_RTD_AAR_SUPPORT + { NDEF_TNF_RTD_EXTERNAL_TYPE, &bufRtdTypeAar, ndefRecordToRtdAar }, +#endif +#if NDEF_TYPE_RTD_WLC_SUPPORT + { NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufTypeRtdWlcCapability, ndefRecordToRtdWlcCapability }, + { NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufTypeRtdWlcStatusInfo, ndefRecordToRtdWlcStatusInfo }, + { NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufTypeRtdWlcPollInfo, ndefRecordToRtdWlcPollInfo }, + { NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufTypeRtdWlcListenCtl, ndefRecordToRtdWlcListenCtl }, +#endif +#if NDEF_TYPE_RTD_WPCWLC_SUPPORT + { NDEF_TNF_RTD_EXTERNAL_TYPE, &bufRtdTypeWpcWlc, ndefRecordToRtdWpcWlc }, +#endif +#if NDEF_TYPE_RTD_TNEP_SUPPORT + { NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufRtdTypeTnepServiceParameter, ndefRecordToRtdTnepServiceParameter }, + { NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufRtdTypeTnepServiceSelect, ndefRecordToRtdTnepServiceSelect }, + { NDEF_TNF_RTD_WELL_KNOWN_TYPE, &bufRtdTypeTnepStatus, ndefRecordToRtdTnepStatus }, +#endif +#if NDEF_TYPE_BLUETOOTH_SUPPORT + { NDEF_TNF_MEDIA_TYPE, &bufMediaTypeBluetoothBrEdr, ndefRecordToBluetooth }, + { NDEF_TNF_MEDIA_TYPE, &bufMediaTypeBluetoothLe, ndefRecordToBluetooth }, + { NDEF_TNF_MEDIA_TYPE, &bufMediaTypeBluetoothSecureBrEdr, ndefRecordToBluetooth }, + { NDEF_TNF_MEDIA_TYPE, &bufMediaTypeBluetoothSecureLe, ndefRecordToBluetooth }, +#endif +#if NDEF_TYPE_VCARD_SUPPORT + { NDEF_TNF_MEDIA_TYPE, &bufMediaTypeVCard, ndefRecordToVCard }, +#endif +#if NDEF_TYPE_WIFI_SUPPORT + { NDEF_TNF_MEDIA_TYPE, &bufMediaTypeWifi, ndefRecordToWifi }, +#endif + /* Non-conditional field to avoid empty union when all types are disabled */ + { 0, NULL, NULL } + }; + + const ndefType* ndefData; + + if (type == NULL) + { + return ERR_PARAM; + } + + ndefData = ndefRecordGetNdefType(record); + if (ndefData != NULL) + { + /* Return the well-known type contained in the record */ + (void)ST_MEMCPY(type, ndefData, sizeof(ndefType)); + return ERR_NONE; + } + + for (int32_t i = 0; i < (int32_t)SIZEOF_ARRAY(typeConverterTable); i++) + { + if (ndefRecordTypeMatch(record, typeConverterTable[i].tnf, typeConverterTable[i].bufTypeString)) + { + /* Call the appropriate function to the matching type */ + if (typeConverterTable[i].recordToType != NULL) + { + return typeConverterTable[i].recordToType(record, type); + } + } + } + +#if NDEF_TYPE_FLAT_SUPPORT + return ndefRecordToFlatPayloadType(record, type); +#else + return ERR_NOT_IMPLEMENTED; +#endif +} + + +/*****************************************************************************/ +ndefStatus ndefTypeToRecord(const ndefType* type, ndefRecord* record) +{ + if (type == NULL) + { + return ERR_PARAM; + } + + if (type->typeToRecord != NULL) + { + return type->typeToRecord(type, record); + } + + return ERR_NOT_IMPLEMENTED; +} + + +/*****************************************************************************/ +ndefStatus ndefRecordSetNdefType(ndefRecord* record, const ndefType* type) +{ + uint32_t payloadLength; + + if ( (record == NULL) || + (type == NULL) || + (type->id == NDEF_TYPE_ID_NONE) || + (type->id > NDEF_TYPE_ID_COUNT) || + (type->getPayloadLength == NULL) || + (type->getPayloadItem == NULL) || + (type->typeToRecord == NULL) ) + { + return ERR_PARAM; + } + + record->ndeftype = type; + + /* Set Short Record bit accordingly */ + payloadLength = ndefRecordGetPayloadLength(record); + ndefHeaderSetValueSR(record, (payloadLength <= NDEF_SHORT_RECORD_LENGTH_MAX) ? 1 : 0); + + return ERR_NONE; +} + + +/*****************************************************************************/ +const ndefType* ndefRecordGetNdefType(const ndefRecord* record) +{ + if (record == NULL) + { + return NULL; + } + + /* Check whether it is a valid NDEF type */ + if ( (record->ndeftype != NULL) && + (record->ndeftype->id != NDEF_TYPE_ID_NONE) && + (record->ndeftype->id < NDEF_TYPE_ID_COUNT) && + (record->ndeftype->getPayloadItem != NULL) && + (record->ndeftype->getPayloadLength != NULL) && + (record->ndeftype->typeToRecord != NULL) ) + { + return record->ndeftype; + } + + return NULL; +} diff --git a/components/spi-st25r3911b/NDEF/source/poller/ndef_poller.c b/components/spi-st25r3911b/NDEF/source/poller/ndef_poller.c new file mode 100644 index 0000000..21bc1e7 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/poller/ndef_poller.c @@ -0,0 +1,513 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief Provides NDEF methods and definitions to access NFC Forum Tags + * + * This module provides an interface to handle NDEF message + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_poller.h" +#include "ndef_t2t.h" +#include "ndef_t3t.h" +#include "ndef_t4t.h" +#include "ndef_t5t_hal.h" +#include "ndef_t5t.h" +#include "utils.h" + +/* + ****************************************************************************** + * ENABLE SWITCH + ****************************************************************************** + */ + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + +/* + ****************************************************************************** + * GLOBAL MACROS + ****************************************************************************** + */ + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL VARIABLE DEFINITIONS + ****************************************************************************** + */ + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + + +/*******************************************************************************/ +ndefStatus ndefPollerContextInitialization(ndefContext *ctx, const ndefDevice *dev) +{ + ndefDeviceType type; + +#if NDEF_FEATURE_T1T + static const ndefPollerWrapper ndefT1TWrapper = + { + NULL, /* ndefT1TPollerContextInitialization, */ + NULL, /* ndefT1TPollerNdefDetect, */ + NULL, /* ndefT1TPollerReadBytes, */ + NULL, /* ndefT1TPollerReadRawMessage, */ +#if NDEF_FEATURE_FULL_API + NULL, /* ndefT1TPollerWriteBytes, */ + NULL, /* ndefT1TPollerWriteRawMessage, */ + NULL, /* ndefT1TPollerTagFormat, */ + NULL, /* ndefT1TPollerWriteRawMessageLen */ + NULL, /* ndefT1TPollerCheckPresence */ + NULL, /* ndefT1TPollerCheckAvailableSpace */ + NULL, /* ndefT1TPollerBeginWriteMessage */ + NULL, /* ndefT1TPollerEndWriteMessage */ + NULL /* ndefT1TPollerSetReadOnly */ +#endif /* NDEF_FEATURE_FULL_API */ + }; +#endif /* NDEF_FEATURE_T1T */ + +#if NDEF_FEATURE_T2T + static const ndefPollerWrapper ndefT2TWrapper = + { + ndefT2TPollerContextInitialization, + ndefT2TPollerNdefDetect, + ndefT2TPollerReadBytes, + ndefT2TPollerReadRawMessage, +#if NDEF_FEATURE_FULL_API + ndefT2TPollerWriteBytes, + ndefT2TPollerWriteRawMessage, + ndefT2TPollerTagFormat, + ndefT2TPollerWriteRawMessageLen, + ndefT2TPollerCheckPresence, + ndefT2TPollerCheckAvailableSpace, + ndefT2TPollerBeginWriteMessage, + ndefT2TPollerEndWriteMessage, + ndefT2TPollerSetReadOnly +#endif /* NDEF_FEATURE_FULL_API */ + }; +#endif /* NDEF_FEATURE_T2T */ + +#if NDEF_FEATURE_T3T + static const ndefPollerWrapper ndefT3TWrapper = + { + ndefT3TPollerContextInitialization, + ndefT3TPollerNdefDetect, + ndefT3TPollerReadBytes, + ndefT3TPollerReadRawMessage, +#if NDEF_FEATURE_FULL_API + ndefT3TPollerWriteBytes, + ndefT3TPollerWriteRawMessage, + ndefT3TPollerTagFormat, + ndefT3TPollerWriteRawMessageLen, + ndefT3TPollerCheckPresence, + ndefT3TPollerCheckAvailableSpace, + ndefT3TPollerBeginWriteMessage, + ndefT3TPollerEndWriteMessage, + ndefT3TPollerSetReadOnly +#endif /* NDEF_FEATURE_FULL_API */ + }; +#endif /* NDEF_FEATURE_T3T */ + +#if NDEF_FEATURE_T4T + static const ndefPollerWrapper ndefT4TWrapper = + { + ndefT4TPollerContextInitialization, + ndefT4TPollerNdefDetect, + ndefT4TPollerReadBytes, + ndefT4TPollerReadRawMessage, +#if NDEF_FEATURE_FULL_API + ndefT4TPollerWriteBytes, + ndefT4TPollerWriteRawMessage, + ndefT4TPollerTagFormat, + ndefT4TPollerWriteRawMessageLen, + ndefT4TPollerCheckPresence, + ndefT4TPollerCheckAvailableSpace, + ndefT4TPollerBeginWriteMessage, + ndefT4TPollerEndWriteMessage, + ndefT4TPollerSetReadOnly +#endif /* NDEF_FEATURE_FULL_API */ + }; +#endif /* NDEF_FEATURE_T4T */ + +#if NDEF_FEATURE_T5T + static const ndefPollerWrapper ndefT5TWrapper = + { + ndefT5TPollerContextInitialization, + ndefT5TPollerNdefDetect, + ndefT5TPollerReadBytes, + ndefT5TPollerReadRawMessage, +#if NDEF_FEATURE_FULL_API + ndefT5TPollerWriteBytes, + ndefT5TPollerWriteRawMessage, + ndefT5TPollerTagFormat, + ndefT5TPollerWriteRawMessageLen, + ndefT5TPollerCheckPresence, + ndefT5TPollerCheckAvailableSpace, + ndefT5TPollerBeginWriteMessage, + ndefT5TPollerEndWriteMessage, + ndefT5TPollerSetReadOnly +#endif /* NDEF_FEATURE_FULL_API */ + }; +#endif /* NDEF_FEATURE_T5T */ + + static const ndefPollerWrapper *ndefPollerWrappers[] = + { + NULL, /* No device */ +#if NDEF_FEATURE_T1T + &ndefT1TWrapper, +#else + NULL, +#endif +#if NDEF_FEATURE_T2T + &ndefT2TWrapper, +#else + NULL, +#endif +#if NDEF_FEATURE_T3T + &ndefT3TWrapper, +#else + NULL, +#endif +#if NDEF_FEATURE_T4T + &ndefT4TWrapper, +#else + NULL, +#endif +#if NDEF_FEATURE_T5T + &ndefT5TWrapper, +#else + NULL, +#endif + }; + + if( (ctx == NULL) || (dev == NULL) ) + { + return ERR_PARAM; + } + + type = ndefGetDeviceType(dev); + + if( (type == NDEF_DEV_NONE) || ((uint32_t)type >= SIZEOF_ARRAY(ndefPollerWrappers)) ) + { + return ERR_PARAM; + } + + ctx->ndefPollWrapper = ndefPollerWrappers[type]; + + /* ndefPollWrapper is NULL when support of a given tag type is not enabled */ + if( (ctx->ndefPollWrapper == NULL) || (ctx->ndefPollWrapper->pollerContextInitialization == NULL) ) + { + return ERR_NOTSUPP; + } + + return (ctx->ndefPollWrapper->pollerContextInitialization)(ctx, dev); +} + +/*******************************************************************************/ +ndefStatus ndefPollerNdefDetect(ndefContext *ctx, ndefInfo *info) +{ + if( ctx == NULL ) + { + return ERR_PARAM; + } + + if( ctx->ndefPollWrapper == NULL ) + { + return ERR_WRONG_STATE; + } + + if( ctx->ndefPollWrapper->pollerNdefDetect == NULL ) + { + return ERR_NOTSUPP; + } + + return (ctx->ndefPollWrapper->pollerNdefDetect)(ctx, info); +} + +/*******************************************************************************/ +ndefStatus ndefPollerReadRawMessage(ndefContext *ctx, uint8_t *buf, uint32_t bufLen, uint32_t *rcvdLen, bool single) +{ + if( ctx == NULL ) + { + return ERR_PARAM; + } + + if( ctx->ndefPollWrapper == NULL ) + { + return ERR_WRONG_STATE; + } + + if( ctx->ndefPollWrapper->pollerReadRawMessage == NULL ) + { + return ERR_NOTSUPP; + } + + return (ctx->ndefPollWrapper->pollerReadRawMessage)(ctx, buf, bufLen, rcvdLen, single); +} + +/*******************************************************************************/ +ndefStatus ndefPollerReadBytes(ndefContext *ctx, uint32_t offset, uint32_t len, uint8_t *buf, uint32_t *rcvdLen) +{ + if( ctx == NULL ) + { + return ERR_PARAM; + } + + if( ctx->ndefPollWrapper == NULL ) + { + return ERR_WRONG_STATE; + } + + if( ctx->ndefPollWrapper->pollerReadBytes == NULL ) + { + return ERR_NOTSUPP; + } + + return (ctx->ndefPollWrapper->pollerReadBytes)(ctx, offset, len, buf, rcvdLen); +} + +#if NDEF_FEATURE_FULL_API + +/*******************************************************************************/ +ndefStatus ndefPollerWriteRawMessage(ndefContext *ctx, const uint8_t *buf, uint32_t bufLen) +{ + if( ctx == NULL ) + { + return ERR_PARAM; + } + + if( ctx->ndefPollWrapper == NULL ) + { + return ERR_WRONG_STATE; + } + + if( ctx->ndefPollWrapper->pollerWriteRawMessage == NULL ) + { + return ERR_NOTSUPP; + } + + return (ctx->ndefPollWrapper->pollerWriteRawMessage)(ctx, buf, bufLen); +} + +/*******************************************************************************/ +ndefStatus ndefPollerTagFormat(ndefContext *ctx, const ndefCapabilityContainer *cc, uint32_t options) +{ + if( ctx == NULL ) + { + return ERR_PARAM; + } + + if( ctx->ndefPollWrapper == NULL ) + { + return ERR_WRONG_STATE; + } + + if( ctx->ndefPollWrapper->pollerTagFormat == NULL ) + { + return ERR_NOTSUPP; + } + + return (ctx->ndefPollWrapper->pollerTagFormat)(ctx, cc, options); +} + +/*******************************************************************************/ +ndefStatus ndefPollerWriteRawMessageLen(ndefContext *ctx, uint32_t rawMessageLen) +{ + if( ctx == NULL ) + { + return ERR_PARAM; + } + + if( ctx->ndefPollWrapper == NULL ) + { + return ERR_WRONG_STATE; + } + + if( ctx->ndefPollWrapper->pollerWriteRawMessageLen == NULL ) + { + return ERR_NOTSUPP; + } + + return (ctx->ndefPollWrapper->pollerWriteRawMessageLen)(ctx, rawMessageLen, true); +} + +/*******************************************************************************/ +ndefStatus ndefPollerWriteBytes(ndefContext *ctx, uint32_t offset, const uint8_t *buf, uint32_t len) +{ + if( ctx == NULL ) + { + return ERR_PARAM; + } + + if( ctx->ndefPollWrapper == NULL ) + { + return ERR_WRONG_STATE; + } + + if( ctx->ndefPollWrapper->pollerWriteBytes == NULL ) + { + return ERR_NOTSUPP; + } + + return (ctx->ndefPollWrapper->pollerWriteBytes)(ctx, offset, buf, len, false, false); +} + +/*******************************************************************************/ +ndefStatus ndefPollerCheckPresence(ndefContext *ctx) +{ + if( ctx == NULL ) + { + return ERR_PARAM; + } + + if( ctx->ndefPollWrapper == NULL ) + { + return ERR_WRONG_STATE; + } + + if( ctx->ndefPollWrapper->pollerCheckPresence == NULL ) + { + return ERR_NOTSUPP; + } + + return (ctx->ndefPollWrapper->pollerCheckPresence)(ctx); +} + +/*******************************************************************************/ +ndefStatus ndefPollerCheckAvailableSpace(const ndefContext *ctx, uint32_t messageLen) +{ + if( ctx == NULL ) + { + return ERR_PARAM; + } + + if( ctx->ndefPollWrapper == NULL ) + { + return ERR_WRONG_STATE; + } + + if( ctx->ndefPollWrapper->pollerCheckAvailableSpace == NULL ) + { + return ERR_NOTSUPP; + } + + return (ctx->ndefPollWrapper->pollerCheckAvailableSpace)(ctx, messageLen); +} + +/*******************************************************************************/ +ndefStatus ndefPollerBeginWriteMessage(ndefContext *ctx, uint32_t messageLen) +{ + if( ctx == NULL ) + { + return ERR_PARAM; + } + + if( ctx->ndefPollWrapper == NULL ) + { + return ERR_WRONG_STATE; + } + + if( ctx->ndefPollWrapper->pollerBeginWriteMessage == NULL ) + { + return ERR_NOTSUPP; + } + + return (ctx->ndefPollWrapper->pollerBeginWriteMessage)(ctx, messageLen); +} + +/*******************************************************************************/ +ndefStatus ndefPollerEndWriteMessage(ndefContext *ctx, uint32_t messageLen) +{ + if( ctx == NULL ) + { + return ERR_PARAM; + } + + if( ctx->ndefPollWrapper == NULL ) + { + return ERR_WRONG_STATE; + } + + if( ctx->ndefPollWrapper->pollerEndWriteMessage == NULL ) + { + return ERR_NOTSUPP; + } + + return (ctx->ndefPollWrapper->pollerEndWriteMessage)(ctx, messageLen, true); +} + +/*******************************************************************************/ +ndefStatus ndefPollerSetReadOnly(ndefContext *ctx) +{ + if( ctx == NULL ) + { + return ERR_PARAM; + } + + if( ctx->ndefPollWrapper == NULL ) + { + return ERR_WRONG_STATE; + } + + if( ctx->ndefPollWrapper->pollerSetReadOnly == NULL ) + { + return ERR_NOTSUPP; + } + + return (ctx->ndefPollWrapper->pollerSetReadOnly)(ctx); +} + +#endif /* NDEF_FEATURE_FULL_API */ diff --git a/components/spi-st25r3911b/NDEF/source/poller/ndef_poller_message.c b/components/spi-st25r3911b/NDEF/source/poller/ndef_poller_message.c new file mode 100644 index 0000000..ffaf18a --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/poller/ndef_poller_message.c @@ -0,0 +1,240 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief Provides NDEF methods and definitions to access NFC Forum Tags + * + * This module provides an interface between NDEF technology and technology-independant NDEF message + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ + +#include "ndef_poller.h" + +/* + ****************************************************************************** + * ENABLE SWITCH + ****************************************************************************** + */ + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + +/* + ****************************************************************************** + * GLOBAL MACROS + ****************************************************************************** + */ + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + +/* + ****************************************************************************** + * GLOBAL VARIABLE DEFINITIONS + ****************************************************************************** + */ + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + + +#if NDEF_FEATURE_FULL_API + +/*******************************************************************************/ +static ndefStatus ndefPollerWriteRecord(ndefContext *ctx, const ndefRecord *record, uint32_t* recordOffset) +{ + ndefStatus err; + uint8_t recordHeaderBuf[NDEF_RECORD_HEADER_LEN]; + ndefBuffer bufHeader; + ndefConstBuffer bufPayloadItem; + uint32_t offset; + bool firstPayloadItem; + + if ( (ctx == NULL) || (record == NULL) || (recordOffset == NULL) ) + { + return ERR_PARAM; + } + + offset = *recordOffset; + + bufHeader.buffer = recordHeaderBuf; + bufHeader.length = sizeof(recordHeaderBuf); + (void)ndefRecordEncodeHeader(record, &bufHeader); + err = ndefPollerWriteBytes(ctx, offset, bufHeader.buffer, bufHeader.length); + if (err != ERR_NONE) + { + /* Conclude procedure */ + return err; + } + offset += bufHeader.length; + + ndefConstBuffer8 bufType; + ndefRecordGetType(record, NULL, &bufType); + if (bufType.length != 0U) + { + err = ndefPollerWriteBytes(ctx, offset, bufType.buffer, bufType.length); + if (err != ERR_NONE) + { + /* Conclude procedure */ + return err; + } + offset += record->typeLength; + } + + ndefConstBuffer8 bufId; + ndefRecordGetId(record, &bufId); + if (bufId.length != 0U) + { + err = ndefPollerWriteBytes(ctx, offset, bufId.buffer, bufId.length); + if (err != ERR_NONE) + { + /* Conclude procedure */ + return err; + } + offset += record->idLength; + } + if (ndefRecordGetPayloadLength(record) != 0U) + { + firstPayloadItem = true; + while (ndefRecordGetPayloadItem(record, &bufPayloadItem, firstPayloadItem) != NULL) + { + firstPayloadItem = false; + err = ndefPollerWriteBytes(ctx, offset, bufPayloadItem.buffer, bufPayloadItem.length); + if (err != ERR_NONE) + { + /* Conclude procedure */ + return err; + } + offset += bufPayloadItem.length; + } + } + + *recordOffset = offset; + + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefPollerWriteMessage(ndefContext *ctx, const ndefMessage *message) +{ + ndefStatus err; + ndefMessageInfo info; + ndefRecord* record; + uint32_t offset; + + if ( (ctx == NULL) || (message == NULL) ) + { + return ERR_PARAM; + } + + if ( (ctx->state != NDEF_STATE_INITIALIZED) && (ctx->state != NDEF_STATE_READWRITE) ) + { + return ERR_WRONG_STATE; + } + + (void)ndefMessageGetInfo(message, &info); + + /* Verify length of the NDEF message */ + err = ndefPollerCheckAvailableSpace(ctx, info.length); + if (err != ERR_NONE) + { + /* Conclude procedure */ + return ERR_PARAM; + } + + /* Reset L-Field/NLEN field */ + err = ndefPollerBeginWriteMessage(ctx, info.length); + if (err != ERR_NONE) + { + /* Conclude procedure */ + ctx->state = NDEF_STATE_INVALID; + return err; + } + + if (info.length != 0U) + { + offset = ctx->messageOffset; + + record = ndefMessageGetFirstRecord(message); + while (record != NULL) + { + err = ndefPollerWriteRecord(ctx, record, &offset); + if (err != ERR_NONE) + { + /* Conclude procedure */ + ctx->state = NDEF_STATE_INVALID; + return err; + } + + record = ndefMessageGetNextRecord(record); + } + + err = ndefPollerEndWriteMessage(ctx, info.length); + if (err != ERR_NONE) + { + /* Conclude procedure */ + ctx->state = NDEF_STATE_INVALID; + return err; + } + + /* Procedure complete: Set Read/Write state */ + ctx->state = NDEF_STATE_READWRITE; + } + else + { + /* Procedure complete: Set Initialized state */ + ctx->state = NDEF_STATE_INITIALIZED; + } + + return ERR_NONE; +} + +#endif /* NDEF_FEATURE_FULL_API */ diff --git a/components/spi-st25r3911b/NDEF/source/poller/ndef_poller_rf.c b/components/spi-st25r3911b/NDEF/source/poller/ndef_poller_rf.c new file mode 100644 index 0000000..d7088f1 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/poller/ndef_poller_rf.c @@ -0,0 +1,121 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief Provides NDEF methods and definitions to access NFC Forum Tags + * + * This module provides an interface to handle the device type + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ +#include "ndef_poller.h" + +/* + ****************************************************************************** + * ENABLE SWITCH + ****************************************************************************** + */ + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + +/* + ***************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + +/* + ****************************************************************************** + * GLOBAL MACROS + ****************************************************************************** + */ + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + +/*******************************************************************************/ +ndefDeviceType ndefGetDeviceType(const ndefDevice *dev) +{ + ndefDeviceType type = NDEF_DEV_NONE; + + if( dev != NULL ) + { + switch( dev->type ) + { + case RFAL_NFC_LISTEN_TYPE_NFCA: + switch( dev->dev.nfca.type ) + { + case RFAL_NFCA_T1T: + type = NDEF_DEV_T1T; + break; + case RFAL_NFCA_T2T: + type = NDEF_DEV_T2T; + break; + case RFAL_NFCA_T4T: + type = NDEF_DEV_T4T; + break; + default: + break; + } + break; + case RFAL_NFC_LISTEN_TYPE_NFCB: + type = NDEF_DEV_T4T; + break; + case RFAL_NFC_LISTEN_TYPE_NFCF: + type = NDEF_DEV_T3T; + break; + case RFAL_NFC_LISTEN_TYPE_NFCV: + type = NDEF_DEV_T5T; + break; + default: + break; + } + } + + return type; +} diff --git a/components/spi-st25r3911b/NDEF/source/poller/ndef_t2t.c b/components/spi-st25r3911b/NDEF/source/poller/ndef_t2t.c new file mode 100644 index 0000000..401de9e --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/poller/ndef_t2t.c @@ -0,0 +1,1290 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief Provides NDEF methods and definitions to access NFC Forum T2T + * + * This module provides an interface to perform as a NFC Reader/Writer + * to handle a Type 2 Tag T2T + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ +#include "ndef_poller.h" +#include "ndef_t2t.h" +#include "rfal_t2t.h" +#include "utils.h" + +/* + ****************************************************************************** + * ENABLE SWITCH + ****************************************************************************** + */ + +#ifndef NDEF_FEATURE_T2T + #error " NDEF: Module configuration missing. Please enable/disable T2T module by setting: NDEF_FEATURE_T2T" +#endif + +#if NDEF_FEATURE_T2T + +#ifndef NDEF_FEATURE_FULL_API + #error " NDEF: Module configuration missing. Please enable/disable Full API by setting: NDEF_FEATURE_FULL_API" +#endif + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + +#define NDEF_T2T_BLOCK_SIZE 4U /*!< block size */ +#define NDEF_T2T_MAX_SECTOR 255U /*!< Max Number of Sector in Sector Select Command */ /* 00h -- FEh: 255 sectors */ +#define NDEF_T2T_BLOCKS_PER_SECTOR 256U /*!< Number of Block per Sector */ +#define NDEF_T2T_BYTES_PER_SECTOR (NDEF_T2T_BLOCKS_PER_SECTOR * NDEF_T2T_BLOCK_SIZE) /*!< Number of Bytes per Sector */ +#define NDEF_T2T_MAX_OFFSET (NDEF_T2T_BYTES_PER_SECTOR * NDEF_T2T_MAX_SECTOR) /*!< Maximum offset allowed */ +#define NDEF_T2T_3_BYTES_TLV_LEN 0xFFU /* FFh indicates the use of 3 bytes got the L field */ +#define NDEF_T2T_STATIC_MEM_SIZE 48U /* Static memory size */ + +#define NDEF_T2T_CC_OFFSET 12U /*!< CC offset */ +#define NDEF_T2T_CC_LEN 4U /*!< CC length */ +#define NDEF_T2T_AREA_OFFSET 16U /*!< T2T Area starts at block #4 */ + +#define NDEF_T2T_MAGIC 0xE1U /*!< CC Magic Number */ +#define NDEF_T2T_CC_0 0U /*!< CC_0: Magic Number */ +#define NDEF_T2T_CC_1 1U /*!< CC_1: Version */ +#define NDEF_T2T_CC_2 2U /*!< CC_2: Size */ +#define NDEF_T2T_CC_3 3U /*!< CC_3: Access conditions */ + +#define NDEF_T2T_VERSION_1_0 0x10U /*!< Version 1.0 */ + +#define NDEF_T2T_SIZE_DIVIDER 8U /*!< T2T_area size is measured in bytes is equal to 8 * Size */ + +#define NDEF_T2T_TLV_NULL 0x00U /*!< Null TLV */ +#define NDEF_T2T_TLV_LOCK_CTRL 0x01U /*!< Lock Control TLV */ +#define NDEF_T2T_TLV_MEMORY_CTRL 0x02U /*!< Memory Control TLV */ +#define NDEF_T2T_TLV_NDEF_MESSAGE 0x03U /*!< NDEF Message TLV */ +#define NDEF_T2T_TLV_PROPRIETRARY 0xFDU /*!< Proprietary TLV */ +#define NDEF_T2T_TLV_TERMINATOR 0xFEU /*!< Terminator TLV */ + +#define NDEF_T2T_TLV_L_3_BYTES_LEN 3U /*!< TLV L Length: 3 bytes */ +#define NDEF_T2T_TLV_L_1_BYTES_LEN 1U /*!< TLV L Length: 1 byte */ +#define NDEF_T2T_TLV_T_LEN 1U /*!< TLV T Length: 1 byte */ + +#define NDEF_T2T_LOCK_CTRL_LEN 3U /*!< Dyn Lock Control Length: 3 bytes */ +#define NDEF_T2T_MEM_CTRL_LEN 3U /*!< Memory Control Length: 3 bytes */ + +#define NDEF_T2T_DEF_BYTES_LCK_PER_BIT 8U /*!< Default nbr of bytes locked per bit for DynLock */ + +#define NDEF_T2T_WR_ACCESS_GRANTED 0x0U /*!< Write Accces 0h: Access granted w/o any security */ +#define NDEF_T2T_WR_ACCESS_NONE 0xFU /*!< Write Accces Fh: No access granted */ + +#define NDEF_T2T_STATLOCK_OFFSET 10U /*!< Static Lock offset */ + +#ifndef NDEF_T2T_N_RETRY_ERROR +#define NDEF_T2T_N_RETRY_ERROR 1U /*!< nT2T,RETRY,ERROR DP 2.2 B.7 */ +#endif /* NDEF_T2T_N_RETRY_ERROR */ + +#define NDEF_T2T_DYN_LOCK_BYTES_MAX 32U /*!< Max number of Dyn Lock Bytes */ + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + +/* + ****************************************************************************** + * GLOBAL MACROS + ****************************************************************************** + */ + +#define ndefT2TisT2TDevice(device) ((((device)->type == RFAL_NFC_LISTEN_TYPE_NFCA) && ((device)->dev.nfca.type == RFAL_NFCA_T2T))) +#define ndefT2TInvalidateCache(ctx) { (ctx)->subCtx.t2t.cacheAddr = 0xFFFFFFFFU; } + +#define ndefT2TIsReadOnlyAccessGranted(ctx) (((ctx)->cc.t2t.readAccess == 0x0U) && ((ctx)->cc.t2t.writeAccess == NDEF_T2T_WR_ACCESS_NONE)) +#define ndefT2TIsReadWriteAccessGranted(ctx) (((ctx)->cc.t2t.readAccess == 0x0U) && ((ctx)->cc.t2t.writeAccess == NDEF_T2T_WR_ACCESS_GRANTED)) + +#define rfalT2TIsTransmissionError(err) ( ((err) == RFAL_ERR_FRAMING) || ((err) == RFAL_ERR_CRC) || ((err) == RFAL_ERR_PAR) ) + +#define ndefT2TLogD(...) /*!< Macro for the debug log method */ +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ +static ndefStatus ndefT2TPollerReadBlock(ndefContext *ctx, uint16_t blockAddr, uint8_t *buf); + +#if NDEF_FEATURE_FULL_API +static ndefStatus ndefT2TPollerWriteBlock(ndefContext *ctx, uint16_t blockAddr, const uint8_t *buf); +#endif /* NDEF_FEATURE_FULL_API */ + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + +/*******************************************************************************/ +static ndefStatus ndefT2TPollerReadBlock(ndefContext *ctx, uint16_t blockAddr, uint8_t *buf) +{ + ReturnCode ret; + uint8_t secNo; + uint8_t blNo; + uint16_t rcvdLen; + uint32_t retry; + + ndefT2TLogD("ndefT2TPollerReadBlock 0x%2.2x\r\n", blockAddr); + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T2T) || (buf == NULL) ) + { + return ERR_PARAM; + } + + secNo = (uint8_t)(blockAddr >> 8U); + blNo = (uint8_t)blockAddr; + + if( secNo != ctx->subCtx.t2t.currentSecNo ) + { + ret = rfalT2TPollerSectorSelect(secNo); + if( ret != RFAL_ERR_NONE ) + { + return ERR_REQUEST; + } + ctx->subCtx.t2t.currentSecNo = secNo; + } + + retry = NDEF_T2T_N_RETRY_ERROR; + do + { + ret = rfalT2TPollerRead(blNo, buf, NDEF_T2T_READ_RESP_SIZE, &rcvdLen); + } + while ( (retry-- != 0U) && rfalT2TIsTransmissionError(ret) ); + + if( (ret == RFAL_ERR_NONE) && (rcvdLen != NDEF_T2T_READ_RESP_SIZE) ) + { + return ERR_REQUEST; + } + + return (ret == RFAL_ERR_NONE ? ERR_NONE : ERR_REQUEST); +} + +/*******************************************************************************/ +ndefStatus ndefT2TPollerReadBytes(ndefContext *ctx, uint32_t offset, uint32_t len, uint8_t *buf, uint32_t *rcvdLen) +{ + ndefStatus ret; + uint8_t le; + uint32_t lvOffset = offset; + uint32_t lvLen = len; + uint8_t* lvBuf = buf; + uint16_t blockAddr; + uint8_t byteNo; + uint8_t numOfValidBlocks; + + ndefT2TLogD("ndefT2TPollerReadBytes offset: %d, len %d\r\n", offset, len); + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T2T) || (lvLen == 0U) || (offset > NDEF_T2T_MAX_OFFSET) ) + { + return ERR_PARAM; + } + + if( (offset >= ctx->subCtx.t2t.cacheAddr) && (offset < (ctx->subCtx.t2t.cacheAddr + NDEF_T2T_READ_RESP_SIZE)) && ((offset + len) < (ctx->subCtx.t2t.cacheAddr + NDEF_T2T_READ_RESP_SIZE)) ) + { + /* data in cache buffer */ + (void)ST_MEMCPY(lvBuf, &ctx->subCtx.t2t.cacheBuf[offset - ctx->subCtx.t2t.cacheAddr], len); + } + else + { + do { + blockAddr = (uint16_t)(lvOffset / NDEF_T2T_BLOCK_SIZE); + byteNo = (uint8_t)(lvOffset % NDEF_T2T_BLOCK_SIZE); + le = (lvLen < NDEF_T2T_READ_RESP_SIZE) ? (uint8_t)lvLen : (uint8_t)NDEF_T2T_READ_RESP_SIZE; + if( ((uint32_t)(uint8_t)blockAddr + (NDEF_T2T_READ_RESP_SIZE/NDEF_T2T_BLOCK_SIZE)) > NDEF_T2T_BLOCKS_PER_SECTOR ) + { + numOfValidBlocks = (uint8_t)(NDEF_T2T_BLOCKS_PER_SECTOR - (uint8_t)blockAddr); + le = MIN(le, numOfValidBlocks * NDEF_T2T_BLOCK_SIZE); + ndefT2TLogD("ndefT2TPollerReadBytes blockAddr: 0x%4.4x numofValidBlock: %d le: %d \r\n", blockAddr, numOfValidBlocks, le); + } + else + { + numOfValidBlocks = NDEF_T2T_READ_RESP_SIZE/NDEF_T2T_BLOCK_SIZE; + } + + if( (byteNo != 0U ) || (lvLen < NDEF_T2T_READ_RESP_SIZE) ) + { + ret = ndefT2TPollerReadBlock(ctx, blockAddr, ctx->subCtx.t2t.cacheBuf); + if( ret != ERR_NONE ) + { + ndefT2TInvalidateCache(ctx); + return ret; + } + ctx->subCtx.t2t.cacheAddr = (uint32_t)blockAddr * NDEF_T2T_BLOCK_SIZE; + if( (NDEF_T2T_READ_RESP_SIZE - byteNo) < le ) + { + le = NDEF_T2T_READ_RESP_SIZE - byteNo; + } + if( le > 0U) + { + (void)ST_MEMCPY(lvBuf, &ctx->subCtx.t2t.cacheBuf[byteNo], le); + } + } + else + { + ret = ndefT2TPollerReadBlock(ctx, blockAddr, lvBuf); + if( ret != ERR_NONE ) + { + return ret; + } + if( (lvLen == le) && (numOfValidBlocks == (NDEF_T2T_READ_RESP_SIZE/NDEF_T2T_BLOCK_SIZE)) ) + { + /* cache the last read block */ + (void)ST_MEMCPY(&ctx->subCtx.t2t.cacheBuf[0], lvBuf, NDEF_T2T_READ_RESP_SIZE); + ctx->subCtx.t2t.cacheAddr = (uint32_t)blockAddr * NDEF_T2T_BLOCK_SIZE; + } + } + lvBuf = &lvBuf[le]; + lvOffset += le; + lvLen -= le; + + } while( lvLen != 0U ); + } + + if( rcvdLen != NULL ) + { + *rcvdLen = len; + } + return ERR_NONE; +} + +/*******************************************************************************/ +static ndefStatus ndefT2TPollerSplitIntoAvailableAreas(ndefContext *ctx, uint32_t offset, uint32_t len, uint32_t *physOffset, uint32_t *maxLen) +{ + uint32_t updatedOffset; + uint32_t updatedLen; + uint32_t i; + + ndefT2TLogD("ndefT2TPollerSplitIntoAvailableAreas offset %d, len %d\r\n", offset, len); + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T2T) || (physOffset == NULL) || (maxLen == NULL) ) + { + return ERR_PARAM; + } + + updatedOffset = offset; + updatedLen = len; + + for( i = 0; i < ctx->subCtx.t2t.nbrRsvdAreas; i++ ) + { + ndefT2TLogD("ndefT2TPollerSplitIntoAvailableAreas area #%d, start: %d Len: %d\r\n", i, ctx->subCtx.t2t.rsvdAreaFirstByteAddr[i], ctx->subCtx.t2t.rsvdAreaSize[i]); + if( updatedOffset >= ctx->subCtx.t2t.rsvdAreaFirstByteAddr[i] ) + { + updatedOffset += ctx->subCtx.t2t.rsvdAreaSize[i]; + } + else + { + if( (updatedOffset + len) > ctx->subCtx.t2t.rsvdAreaFirstByteAddr[i] ) + { + updatedLen = ctx->subCtx.t2t.rsvdAreaFirstByteAddr[i] - updatedOffset; + } + break; + } + } + *physOffset = updatedOffset; + *maxLen = updatedLen; + return ERR_NONE; +} + +/*******************************************************************************/ +static ndefStatus ndefT2TPollerReadBytesFromAvailableAreas(ndefContext *ctx, uint32_t offset, uint32_t len, uint8_t *buf, uint32_t *rcvdLen) +{ + ndefStatus ret; + uint32_t curOffset; + uint32_t curPhyOffset; + uint32_t remainingLen; + uint32_t curRcvdLen; + uint32_t maxLen; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T2T) ) + { + return ERR_PARAM; + } + + curOffset = offset; + remainingLen = len; + if( rcvdLen != NULL ) + { + *rcvdLen = 0U; + } + while( remainingLen > 0U ) + { + (void)ndefT2TPollerSplitIntoAvailableAreas(ctx, curOffset, remainingLen, &curPhyOffset, &maxLen); + ndefT2TLogD("ndefT2TPollerReadBytesFromAvailableAreas CurOffset: %d, curPhyOffset:%d Len :%d , buf offset: %d\r\n", curOffset, curPhyOffset, maxLen, len - remainingLen); + ret = ndefT2TPollerReadBytes(ctx, curPhyOffset, maxLen, &buf[len - remainingLen], &curRcvdLen); + if(ret != ERR_NONE ) + { + return ret; + } + if( rcvdLen != NULL ) + { + *rcvdLen += curRcvdLen; + } + remainingLen -= maxLen; + curOffset += maxLen; + } + return ERR_NONE; +} + +/*******************************************************************************/ +static ndefStatus ndefT2TReadLField(ndefContext *ctx) +{ + ndefStatus ret; + uint32_t offset; + uint8_t data[3]; + uint16_t lenTLV; + + ctx->state = NDEF_STATE_INVALID; + offset = ctx->subCtx.t2t.offsetNdefTLV; + offset++; + ret = ndefT2TPollerReadBytesFromAvailableAreas(ctx, offset, 1, data, NULL); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + return ret; + } + offset++; + lenTLV = data[0]; + if( lenTLV == NDEF_T2T_3_BYTES_TLV_LEN ) + { + ret = ndefT2TPollerReadBytesFromAvailableAreas(ctx, offset, 2, data, NULL); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + return ret; + } + offset += 2U; + lenTLV = GETU16(&data[0]); + } + ctx->messageLen = lenTLV; + ctx->messageOffset = offset; + + if( ctx->messageLen == 0U ) + { + if( !(ndefT2TIsReadWriteAccessGranted(ctx)) ) + { + /* Conclude procedure */ + return ERR_REQUEST; + } + /* Empty message found TS T2T v1.0 7.5.1.6 & TS T2T v1.0 7.4.2.1 */ + ctx->state = NDEF_STATE_INITIALIZED; + } + else + { + if( (ndefT2TIsReadWriteAccessGranted(ctx)) ) + { + /* Empty message found TS T2T v1.0 7.5.1.7 & TS T2T v1.0 7.4.3.1 */ + ctx->state = NDEF_STATE_READWRITE; + } + else + { + if( !(ndefT2TIsReadOnlyAccessGranted(ctx)) ) + { + /* Conclude procedure */ + return ERR_REQUEST; + } + /* Empty message found TS T2T v1.0 7.5.1.7 & TS T2T v1.0 7.4.4.1 */ + ctx->state = NDEF_STATE_READONLY; + } + } + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT2TPollerContextInitialization(ndefContext *ctx, const ndefDevice *dev) +{ + if( (ctx == NULL) || (dev == NULL) || !ndefT2TisT2TDevice(dev) ) + { + return ERR_PARAM; + } + + (void)ST_MEMCPY(&ctx->device, dev, sizeof(ctx->device)); + + ctx->type = NDEF_DEV_T2T; + ctx->state = NDEF_STATE_INVALID; + ctx->subCtx.t2t.currentSecNo = 0U; + ndefT2TInvalidateCache(ctx); + + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT2TPollerNdefDetect(ndefContext *ctx, ndefInfo *info) +{ + ndefStatus ret; + uint8_t data[3]; + uint32_t offset; + uint16_t lenTLV; + uint8_t typeTLV; + uint8_t nbrMajorOffsets; + uint8_t nbrMinorOffsets; + uint8_t majorOffsetSize; + uint8_t blplb; + uint32_t rsvdAreaFirstByteAddr; + uint32_t i, j; + uint32_t maxAddr; + uint32_t rsvdAreasLen; + + if( info != NULL ) + { + info->state = NDEF_STATE_INVALID; + info->majorVersion = 0U; + info->minorVersion = 0U; + info->areaLen = 0U; + info->areaAvalableSpaceLen = 0U; + info->messageLen = 0U; + } + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T2T) ) + { + return ERR_PARAM; + } + + ctx->state = NDEF_STATE_INVALID; + + /* Read CC TS T2T v1.0 7.5.1.1 */ + ret = ndefT2TPollerReadBytes(ctx, NDEF_T2T_CC_OFFSET, NDEF_T2T_CC_LEN, ctx->ccBuf, NULL); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + return ret; + } + ctx->cc.t2t.magicNumber = ctx->ccBuf[NDEF_T2T_CC_0]; + ctx->cc.t2t.majorVersion = ndefMajorVersion(ctx->ccBuf[NDEF_T2T_CC_1]); + ctx->cc.t2t.minorVersion = ndefMinorVersion(ctx->ccBuf[NDEF_T2T_CC_1]); + ctx->cc.t2t.size = ctx->ccBuf[NDEF_T2T_CC_2]; + ctx->cc.t2t.readAccess = (uint8_t)(ctx->ccBuf[NDEF_T2T_CC_3] >> 4U); + ctx->cc.t2t.writeAccess = (uint8_t)(ctx->ccBuf[NDEF_T2T_CC_3] & 0xFU); + ctx->areaLen = (uint32_t)ctx->cc.t2t.size * NDEF_T2T_SIZE_DIVIDER; + maxAddr = ctx->areaLen + NDEF_T2T_AREA_OFFSET; + rsvdAreasLen = 0U; + /* Default Dyn Lock settings TS T2T v1.0 4.7.1 */ + ctx->subCtx.t2t.dynLockFirstByteAddr = ctx->areaLen + NDEF_T2T_AREA_OFFSET; + ctx->subCtx.t2t.dynLockBytesLockedPerBit = NDEF_T2T_DEF_BYTES_LCK_PER_BIT; + ctx->subCtx.t2t.dynLockNbrLockBits = (uint16_t)(ctx->areaLen - NDEF_T2T_STATIC_MEM_SIZE + NDEF_T2T_DEF_BYTES_LCK_PER_BIT -1U) / NDEF_T2T_DEF_BYTES_LCK_PER_BIT; + ctx->subCtx.t2t.dynLockNbrBytes = (ctx->subCtx.t2t.dynLockNbrLockBits + 7U) / 8U; + ctx->subCtx.t2t.nbrRsvdAreas = 0U; + /* Check version number TS T2T v1.0 7.5.1.2 */ + if( (ctx->cc.t2t.magicNumber != NDEF_T2T_MAGIC) || (ctx->cc.t2t.majorVersion > ndefMajorVersion(NDEF_T2T_VERSION_1_0)) ) + { + /* Conclude procedure TS T2T v1.0 7.5.1.2 */ + return ERR_REQUEST; + } + /* Search for NDEF message TLV TS T2T v1.0 7.5.1.3 */ + offset = NDEF_T2T_AREA_OFFSET; + while ( (offset < (NDEF_T2T_AREA_OFFSET + ctx->areaLen)) ) + { + ret = ndefT2TPollerReadBytesFromAvailableAreas(ctx, offset, 1, data, NULL); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + return ret; + } + typeTLV = data[0]; + if( typeTLV == NDEF_T2T_TLV_NDEF_MESSAGE ) + { + ctx->subCtx.t2t.offsetNdefTLV = offset; + } + offset++; + if( typeTLV == NDEF_T2T_TLV_TERMINATOR ) + { + break; + } + if( typeTLV == NDEF_T2T_TLV_NULL ) + { + continue; + } + /* read TLV Len */ + ret = ndefT2TPollerReadBytesFromAvailableAreas(ctx, offset, 1, data, NULL); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + return ret; + } + offset++; + lenTLV = data[0]; + if( lenTLV == NDEF_T2T_3_BYTES_TLV_LEN ) + { + ret = ndefT2TPollerReadBytesFromAvailableAreas(ctx, offset, 2, data, NULL); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + return ret; + } + offset += 2U; + lenTLV = GETU16(&data[0]); + } + if( typeTLV == NDEF_T2T_TLV_LOCK_CTRL ) + { + if( lenTLV != NDEF_T2T_LOCK_CTRL_LEN ) + { + return ERR_REQUEST; + } + if( ctx->subCtx.t2t.nbrRsvdAreas >= NDEF_T2T_MAX_RSVD_AREAS ) + { + return ERR_REQUEST; + } + ret = ndefT2TPollerReadBytesFromAvailableAreas(ctx, offset, NDEF_T2T_LOCK_CTRL_LEN, data, NULL); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + return ret; + } + nbrMajorOffsets = (uint8_t)(data[0] >> 4U); + nbrMinorOffsets = (uint8_t)(data[0] & 0x0FU); + ctx->subCtx.t2t.dynLockNbrLockBits = (data[1] == 0U) ? 256U : (uint16_t)data[1]; + blplb = (uint8_t)(data[2] >> 4U); + majorOffsetSize = (uint8_t)(data[2] & 0x0FU); + if ( (blplb == 0U) || (majorOffsetSize == 0U) ) + { + /* values 0h are RFU */ + return ERR_REQUEST; + } + ctx->subCtx.t2t.dynLockBytesLockedPerBit = (uint16_t)1U << blplb; + ctx->subCtx.t2t.dynLockFirstByteAddr = (nbrMajorOffsets * ( (uint32_t)1U << majorOffsetSize) ) + nbrMinorOffsets; + ctx->subCtx.t2t.dynLockNbrBytes = (ctx->subCtx.t2t.dynLockNbrLockBits + 7U) / 8U; /* TS T2T v1.0 4.9.5 */ + rsvdAreaFirstByteAddr = ctx->subCtx.t2t.dynLockFirstByteAddr; + if( rsvdAreaFirstByteAddr < maxAddr) + { + for( i = 0; i < ctx->subCtx.t2t.nbrRsvdAreas; i++ ) + { + if( rsvdAreaFirstByteAddr < ctx->subCtx.t2t.rsvdAreaFirstByteAddr[i] ) + { + for(j = i; j < ctx->subCtx.t2t.nbrRsvdAreas; j++) + { + ctx->subCtx.t2t.rsvdAreaFirstByteAddr[j + 1U] = ctx->subCtx.t2t.rsvdAreaFirstByteAddr[j]; + ctx->subCtx.t2t.rsvdAreaSize[j + 1U] = ctx->subCtx.t2t.rsvdAreaSize[j]; + } + break; + } + } + ctx->subCtx.t2t.rsvdAreaFirstByteAddr[i] = rsvdAreaFirstByteAddr; + ctx->subCtx.t2t.rsvdAreaSize[i] = ((ctx->subCtx.t2t.dynLockNbrBytes + 3U)/ 4U) * 4U; + if( (rsvdAreaFirstByteAddr + ctx->subCtx.t2t.rsvdAreaSize[i]) > maxAddr ) + { + ctx->subCtx.t2t.rsvdAreaSize[i] = (uint16_t)(maxAddr - ctx->subCtx.t2t.rsvdAreaSize[i]); + } + rsvdAreasLen += ctx->subCtx.t2t.rsvdAreaSize[i]; + ctx->subCtx.t2t.nbrRsvdAreas++; + } + } + if( typeTLV == NDEF_T2T_TLV_MEMORY_CTRL ) + { + if( lenTLV != NDEF_T2T_MEM_CTRL_LEN ) + { + offset += lenTLV; + continue; + } + if( ctx->subCtx.t2t.nbrRsvdAreas >= NDEF_T2T_MAX_RSVD_AREAS ) + { + return ERR_REQUEST; + } + ret = ndefT2TPollerReadBytesFromAvailableAreas(ctx, offset, NDEF_T2T_MEM_CTRL_LEN, data, NULL); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + return ret; + } + nbrMajorOffsets = (uint8_t)(data[0] >> 4U); + nbrMinorOffsets = (uint8_t)(data[0] & 0x0FU); + majorOffsetSize = (uint8_t)(data[2] & 0x0FU); + if( majorOffsetSize == 0U ) + { + /* value 0h is RFU */ + return ERR_REQUEST; + } + rsvdAreaFirstByteAddr = (nbrMajorOffsets * ((uint32_t)1U << majorOffsetSize)) + nbrMinorOffsets; + if( rsvdAreaFirstByteAddr < maxAddr) + { + for( i = 0; i < ctx->subCtx.t2t.nbrRsvdAreas; i++ ) + { + if( rsvdAreaFirstByteAddr < ctx->subCtx.t2t.rsvdAreaFirstByteAddr[i] ) + { + for(j = i; j < ctx->subCtx.t2t.nbrRsvdAreas; j++) + { + ctx->subCtx.t2t.rsvdAreaFirstByteAddr[j + 1U] = ctx->subCtx.t2t.rsvdAreaFirstByteAddr[j]; + ctx->subCtx.t2t.rsvdAreaSize[j + 1U] = ctx->subCtx.t2t.rsvdAreaSize[j]; + } + break; + } + } + ctx->subCtx.t2t.rsvdAreaFirstByteAddr[i] = rsvdAreaFirstByteAddr; + ctx->subCtx.t2t.rsvdAreaSize[i] = (data[1] == 0U) ? 256U : (uint16_t)data[1]; + if( (rsvdAreaFirstByteAddr + ctx->subCtx.t2t.rsvdAreaSize[i]) > maxAddr ) + { + ctx->subCtx.t2t.rsvdAreaSize[i] = (uint16_t)(maxAddr - ctx->subCtx.t2t.rsvdAreaSize[i]); + } + rsvdAreasLen += ctx->subCtx.t2t.rsvdAreaSize[i]; + ctx->subCtx.t2t.nbrRsvdAreas++; + } + } + /* NDEF message present TLV TS T2T v1.0 7.5.1.4 */ + if( typeTLV == NDEF_T2T_TLV_NDEF_MESSAGE ) + { + /* Read length TS T2T v1.0 7.5.1.5 */ + ctx->messageLen = lenTLV; + ctx->messageOffset = offset; + if( ctx->messageLen == 0U ) + { + if( !(ndefT2TIsReadWriteAccessGranted(ctx)) ) + { + /* Conclude procedure */ + return ERR_REQUEST; + } + /* Empty message found TS T2T v1.0 7.5.1.6 & TS T2T v1.0 7.4.2.1 */ + ctx->state = NDEF_STATE_INITIALIZED; + } + else + { + if( (ndefT2TIsReadWriteAccessGranted(ctx)) ) + { + /* Empty message found TS T2T v1.0 7.5.1.7 & TS T2T v1.0 7.4.3.1 */ + ctx->state = NDEF_STATE_READWRITE; + } + else + { + if( !(ndefT2TIsReadOnlyAccessGranted(ctx)) ) + { + /* Conclude procedure */ + return ERR_REQUEST; + } + /* Empty message found TS T2T v1.0 7.5.1.7 & TS T2T v1.0 7.4.4.1 */ + ctx->state = NDEF_STATE_READONLY; + } + } + ctx->areaLen -= rsvdAreasLen; + if( info != NULL ) + { + info->state = ctx->state; + info->majorVersion = ctx->cc.t2t.majorVersion; + info->minorVersion = ctx->cc.t2t.minorVersion; + info->areaLen = ctx->areaLen; + info->areaAvalableSpaceLen = ctx->areaLen - ctx->messageOffset; + info->messageLen = ctx->messageLen; + } + return ERR_NONE; + } + offset += lenTLV; + } + return ERR_REQUEST; +} + +/*******************************************************************************/ +ndefStatus ndefT2TPollerReadRawMessage(ndefContext *ctx, uint8_t *buf, uint32_t bufLen, uint32_t *rcvdLen, bool single) +{ + ndefStatus ret; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T2T) || (buf == NULL) ) + { + return ERR_PARAM; + } + + /* TS T2T v1.0 7.5.2.1: T2T NDEF Detect should have been called at least once before NDEF read procedure */ + + if( ! single ) + { + ndefT2TInvalidateCache(ctx); + ret = ndefT2TReadLField(ctx); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + return ret; + } + } + + /* TS T2T v1.0 7.5.2.3: check presence of NDEF message */ + if ( ctx->state <= NDEF_STATE_INITIALIZED ) + { + /* Conclude procedure TS T4T v1.0 7.2.2.2 */ + return ERR_WRONG_STATE; + } + + if( ctx->messageLen > bufLen ) + { + return ERR_NOMEM; + } + + ret = ndefT2TPollerReadBytesFromAvailableAreas(ctx, ctx->messageOffset, ctx->messageLen, buf, rcvdLen); + if( ret != ERR_NONE ) + { + ctx->state = NDEF_STATE_INVALID; + } + return ret; +} + +#if NDEF_FEATURE_FULL_API + +/*******************************************************************************/ +static ndefStatus ndefT2TPollerWriteBlock(ndefContext *ctx, uint16_t blockAddr, const uint8_t *buf) +{ + ReturnCode ret; + uint8_t secNo; + uint8_t blNo; + uint32_t retry; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T2T) || (buf == NULL) ) + { + return ERR_PARAM; + } + + secNo = (uint8_t)(blockAddr >> 8U); + blNo = (uint8_t)blockAddr; + + if( secNo != ctx->subCtx.t2t.currentSecNo ) + { + ret = rfalT2TPollerSectorSelect(secNo); + if( ret != RFAL_ERR_NONE ) + { + return ERR_REQUEST; + } + ctx->subCtx.t2t.currentSecNo = secNo; + } + + retry = NDEF_T2T_N_RETRY_ERROR; + do + { + ret = rfalT2TPollerWrite(blNo, buf); + } + while ( (retry-- != 0U) && rfalT2TIsTransmissionError(ret) ); + + return (ret == RFAL_ERR_NONE ? ERR_NONE : ERR_REQUEST); +} + +/*******************************************************************************/ +ndefStatus ndefT2TPollerWriteBytes(ndefContext *ctx, uint32_t offset, const uint8_t *buf, uint32_t len, bool pad, bool writeTerminator) +{ + ndefStatus ret; + uint32_t lvOffset = offset; + uint32_t lvLen = len; + const uint8_t* lvBuf = buf; + uint16_t blockAddr; + uint8_t byteNo; + uint8_t le; + uint8_t tempBuf[NDEF_T2T_READ_RESP_SIZE]; + bool lvWriteTerminator = writeTerminator; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T2T) || (lvLen == 0U) ) + { + return ERR_PARAM; + } + + ndefT2TInvalidateCache(ctx); + + do + { + blockAddr = (uint16_t)(lvOffset / NDEF_T2T_BLOCK_SIZE); + byteNo = (uint8_t)(lvOffset % NDEF_T2T_BLOCK_SIZE); + le = (lvLen < NDEF_T2T_BLOCK_SIZE) ? (uint8_t)lvLen : (uint8_t)NDEF_T2T_BLOCK_SIZE; + if( (byteNo != 0U ) || (lvLen < NDEF_T2T_BLOCK_SIZE) ) + { + if( (byteNo != 0U) || !pad ) + { + ret = ndefT2TPollerReadBlock(ctx, blockAddr, tempBuf); + if( ret != ERR_NONE ) + { + return ret; + } + } + if( (byteNo + lvLen) < NDEF_T2T_BLOCK_SIZE ) + { + if( pad ) + { + (void)ST_MEMSET(&tempBuf[byteNo + lvLen], 0x00, NDEF_T2T_BLOCK_SIZE - (byteNo + lvLen)); + } + if( lvWriteTerminator ) + { + tempBuf[byteNo + lvLen] = NDEF_T2T_TLV_TERMINATOR; + lvWriteTerminator = false; + } + } + if( (NDEF_T2T_BLOCK_SIZE - byteNo) < le ) + { + le = NDEF_T2T_BLOCK_SIZE - byteNo; + } + if( le > 0U ) + { + (void)ST_MEMCPY(&tempBuf[byteNo], lvBuf, le); + } + ret = ndefT2TPollerWriteBlock(ctx, blockAddr, tempBuf); + if( ret != ERR_NONE ) + { + return ret; + } + } + else + { + ret = ndefT2TPollerWriteBlock(ctx, blockAddr, lvBuf); + if( ret != ERR_NONE ) + { + return ret; + } + } + lvBuf = &lvBuf[le]; + lvOffset += le; + lvLen -= le; + + } while( lvLen != 0U ); + if( lvWriteTerminator ) + { + blockAddr++; + (void)ST_MEMSET(tempBuf, 0x00, NDEF_T2T_BLOCK_SIZE); + tempBuf[0] = NDEF_T2T_TLV_TERMINATOR; + (void)ndefT2TPollerWriteBlock(ctx, blockAddr, tempBuf); + } + + return ERR_NONE; +} + +/*******************************************************************************/ +static ndefStatus ndefT2TPollerWriteBytesToAvailableAreas(ndefContext *ctx, uint32_t offset, const uint8_t *buf, uint32_t len, bool pad, bool writeTerminator) +{ + ndefStatus ret; + uint32_t curOffset; + uint32_t curPhyOffset; + uint32_t remainingLen; + uint32_t maxLen = 0U; + uint32_t maxLenTerm = 0U; + bool term = false; + bool lvWriteTerminator = writeTerminator; + uint8_t termBuf[1]; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T2T) ) + { + return ERR_PARAM; + } + curOffset = offset; + remainingLen = len; + + while( remainingLen > 0U ) + { + (void)ndefT2TPollerSplitIntoAvailableAreas(ctx, curOffset, remainingLen, &curPhyOffset, &maxLen); + if( (remainingLen == maxLen) && writeTerminator) /* last part */ + { + (void)ndefT2TPollerSplitIntoAvailableAreas(ctx, curOffset, remainingLen + 1U, &curPhyOffset, &maxLenTerm); + if( (remainingLen + 1U) == maxLenTerm ) /* check enough room for terminator in that area */ + { + term = true; + lvWriteTerminator = false; + } + } + ret = ndefT2TPollerWriteBytes(ctx, curPhyOffset, &buf[len - remainingLen], maxLen, (remainingLen == maxLen) && pad, term); + ndefT2TLogD("ndefT2TPollerWriteBytesToAvailableAreas CurOffset: %d, curPhyOffset: %d, Len :%d , buf offset: %d\r\n", curOffset, curPhyOffset, maxLen, len - remainingLen); + if(ret != ERR_NONE ) + { + return ret; + } + remainingLen -= maxLen; + curOffset += maxLen; + } + if( lvWriteTerminator ) + { + (void)ndefT2TPollerSplitIntoAvailableAreas(ctx, curOffset, 1U, &curPhyOffset, &maxLen); + termBuf[0] = NDEF_T2T_TLV_TERMINATOR; + (void)ndefT2TPollerWriteBytes(ctx, curPhyOffset, termBuf, 1U, pad, false); + } + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT2TPollerWriteRawMessageLen(ndefContext *ctx, uint32_t rawMessageLen, bool writeTerminator) +{ + ndefStatus ret; + uint8_t buf[NDEF_T2T_BLOCK_SIZE]; + uint8_t dataIt; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T2T) ) + { + return ERR_PARAM; + } + + if( (ctx->state != NDEF_STATE_INITIALIZED) && (ctx->state != NDEF_STATE_READWRITE) ) + { + return ERR_WRONG_STATE; + } + + if( writeTerminator && (rawMessageLen != 0U) && ((ctx->messageOffset + rawMessageLen) < (ctx->areaLen + NDEF_T2T_AREA_OFFSET)) ) + { + /* Write Terminator TLV */ + dataIt = 0U; + buf[dataIt] = NDEF_T2T_TLV_TERMINATOR; + dataIt++; + ret = ndefT2TPollerWriteBytesToAvailableAreas(ctx, ctx->messageOffset + rawMessageLen, buf, dataIt, true, false); + if( ret != ERR_NONE ) + { + return ret; + } + } + + /* Prepare L buffer content - Don't need to write T byte so skip it */ + dataIt = 0U; + if( rawMessageLen <= NDEF_SHORT_VFIELD_MAX_LEN ) + { + buf[dataIt] = (uint8_t) rawMessageLen; + dataIt++; + if( (rawMessageLen == 0U) && writeTerminator ) + { + buf[dataIt] = NDEF_T2T_TLV_TERMINATOR; + dataIt++; + } + } + else + { + buf[dataIt] = (uint8_t)(NDEF_SHORT_VFIELD_MAX_LEN + 1U); + dataIt++; + buf[dataIt] = (uint8_t) (rawMessageLen >> 8U); + dataIt++; + buf[dataIt] = (uint8_t) rawMessageLen; + dataIt++; + } + + ret = ndefT2TPollerWriteBytesToAvailableAreas(ctx, ctx->subCtx.t2t.offsetNdefTLV + NDEF_T2T_TLV_T_LEN, buf, dataIt, writeTerminator && (rawMessageLen == 0U), false); + return ret; +} + +/*******************************************************************************/ +ndefStatus ndefT2TPollerWriteRawMessage(ndefContext *ctx, const uint8_t *buf, uint32_t bufLen) +{ + ndefStatus ret; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T2T) || ((buf == NULL) && (bufLen != 0U)) ) + { + return ERR_PARAM; + } + + /* TS T2T v1.0 7.5.3.1/2: T4T NDEF Detect should have been called before NDEF write procedure */ + /* Warning: current tag content must not be changed between NDEF Detect procedure and NDEF Write procedure*/ + + /* TS T2T v1.0 7.5.3.3: check write access condition */ + if ( (ctx->state != NDEF_STATE_INITIALIZED) && (ctx->state != NDEF_STATE_READWRITE) ) + { + /* Conclude procedure */ + return ERR_WRONG_STATE; + } + + /* TS T2T v1.0 7.5.3.3: verify available space */ + ret = ndefT2TPollerCheckAvailableSpace(ctx, bufLen); + if( ret != ERR_NONE ) + { + /* Conclude procedures */ + return ERR_PARAM; + } + + /* TS T2T v1.0 7.5.3.4: reset L_Field to 0 */ + /* and update ctx->messageOffset according to L-field len */ + ret = ndefT2TPollerBeginWriteMessage(ctx, bufLen); + if( ret != ERR_NONE ) + { + ctx->state = NDEF_STATE_INVALID; + /* Conclude procedure */ + return ret; + } + + if( bufLen != 0U ) + { + /* TS T2T v1.0 7.5.3.5: write new NDEF message */ + ret = ndefT2TPollerWriteBytesToAvailableAreas(ctx, ctx->messageOffset, buf, bufLen, true, ndefT2TPollerCheckAvailableSpace(ctx, bufLen + 1U) == ERR_NONE); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + ctx->state = NDEF_STATE_INVALID; + return ret; + } + + /* TS T2T v1.0 7.5.3.6 & 7.5.3.7: update L_Field and write Terminator TLV */ + ret = ndefT2TPollerEndWriteMessage(ctx, bufLen, false); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + ctx->state = NDEF_STATE_INVALID; + return ret; + } + } + + return ret; +} + +/*******************************************************************************/ +ndefStatus ndefT2TPollerTagFormat(ndefContext *ctx, const ndefCapabilityContainer *cc, uint32_t options) +{ + ndefStatus ret; + uint8_t dataIt; + static const uint8_t emptyNdef[] = {NDEF_T2T_TLV_NDEF_MESSAGE, 0x00U, NDEF_T2T_TLV_TERMINATOR, 0x00U}; + + NO_WARNING(options); + + /* Check parameters, ensure cc is provided */ + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T2T) || (cc == NULL) ) + { + return ERR_PARAM; + } + + /* + * Read CC area + */ + ret = ndefT2TPollerReadBytes(ctx, NDEF_T2T_CC_OFFSET, NDEF_T2T_CC_LEN, ctx->ccBuf, NULL); + if( ret != ERR_NONE ) + { + return ret; + } + + ndefT2TInvalidateCache(ctx); + + /* + * Write CC only in case of virgin CC area + */ + if( (ctx->ccBuf[NDEF_T2T_CC_0] == 0U) && (ctx->ccBuf[NDEF_T2T_CC_1] == 0U) && (ctx->ccBuf[NDEF_T2T_CC_2] == 0U) && (ctx->ccBuf[NDEF_T2T_CC_3] == 0U) ) + { + dataIt = 0U; + ctx->ccBuf[dataIt] = cc->t2t.magicNumber; + dataIt++; + ctx->ccBuf[dataIt] = (uint8_t)(cc->t2t.majorVersion << 4U) | cc->t2t.minorVersion; + dataIt++; + ctx->ccBuf[dataIt] = cc->t2t.size; + dataIt++; + ctx->ccBuf[dataIt] = (uint8_t)(cc->t2t.readAccess << 4U) | cc->t2t.writeAccess; + dataIt++; + ret = ndefT2TPollerWriteBlock(ctx, NDEF_T2T_CC_OFFSET/NDEF_T2T_BLOCK_SIZE, ctx->ccBuf); + if( ret != ERR_NONE ) + { + return ret; + } + } + + /* + * Write NDEF place holder + */ + ret = ndefT2TPollerWriteBlock(ctx, NDEF_T2T_AREA_OFFSET/NDEF_T2T_BLOCK_SIZE, emptyNdef); + + return ret; +} + +/*******************************************************************************/ +ndefStatus ndefT2TPollerCheckPresence(ndefContext *ctx) +{ + ndefStatus ret; + uint16_t blockAddr; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T2T) ) + { + return ERR_PARAM; + } + + blockAddr = 0U; + ret = ndefT2TPollerReadBlock(ctx, blockAddr, ctx->subCtx.t2t.cacheBuf); + if( ret != ERR_NONE ) + { + ndefT2TInvalidateCache(ctx); + return ret; + } + ctx->subCtx.t2t.cacheAddr = (uint32_t)blockAddr * NDEF_T2T_BLOCK_SIZE; + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT2TPollerCheckAvailableSpace(const ndefContext *ctx, uint32_t messageLen) +{ + uint32_t lLen; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T2T) ) + { + return ERR_PARAM; + } + + if ( ctx->state == NDEF_STATE_INVALID ) + { + return ERR_WRONG_STATE; + } + + lLen = ( messageLen > NDEF_SHORT_VFIELD_MAX_LEN) ? NDEF_T2T_TLV_L_3_BYTES_LEN : NDEF_T2T_TLV_L_1_BYTES_LEN; + + if( (messageLen + ctx->subCtx.t2t.offsetNdefTLV + NDEF_T2T_TLV_T_LEN + lLen) > (ctx->areaLen + NDEF_T2T_AREA_OFFSET) ) + { + return ERR_NOMEM; + } + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT2TPollerBeginWriteMessage(ndefContext *ctx, uint32_t messageLen) +{ + ndefStatus ret; + uint32_t lLen; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T2T) ) + { + return ERR_PARAM; + } + + if( (ctx->state != NDEF_STATE_INITIALIZED) && (ctx->state != NDEF_STATE_READWRITE) ) + { + return ERR_WRONG_STATE; + } + + /* TS T2T v1.0 7.5.3.4: reset L_Field to 0 */ + ret = ndefT2TPollerWriteRawMessageLen(ctx, 0U, true); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + ctx->state = NDEF_STATE_INVALID; + return ret; + } + + lLen = ( messageLen > NDEF_SHORT_VFIELD_MAX_LEN) ? NDEF_T2T_TLV_L_3_BYTES_LEN : NDEF_T2T_TLV_L_1_BYTES_LEN; + ctx->messageOffset = ctx->subCtx.t2t.offsetNdefTLV; + ctx->messageOffset += NDEF_T2T_TLV_T_LEN; /* T Len */ + ctx->messageOffset += lLen; /* L Len */ + + ctx->state = NDEF_STATE_INITIALIZED; + + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT2TPollerEndWriteMessage(ndefContext *ctx, uint32_t messageLen, bool writeTerminator) +{ + ndefStatus ret; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T2T) ) + { + return ERR_PARAM; + } + + if( ctx->state != NDEF_STATE_INITIALIZED ) + { + return ERR_WRONG_STATE; + } + + /* TS T2T v1.0 7.5.3.6 & 7.5.3.7: update L_Field and write Terminator TLV */ + ret = ndefT2TPollerWriteRawMessageLen(ctx, messageLen, writeTerminator); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + ctx->state = NDEF_STATE_INVALID; + return ret; + } + ctx->messageLen = messageLen; + ctx->state = (ctx->messageLen == 0U) ? NDEF_STATE_INITIALIZED : NDEF_STATE_READWRITE; + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT2TPollerSetReadOnly(ndefContext *ctx) +{ + ndefStatus ret; + uint32_t nbrDynLockBits; + uint32_t nbrDynLockBitsInLastByte; + uint8_t dynLockBits[NDEF_T2T_DYN_LOCK_BYTES_MAX]; + uint32_t i, j; + uint32_t maxAddr; + uint32_t addr; + uint32_t bitPos; + uint32_t DynLockByteIndex; + + static const uint8_t staticBits[2] = {0xFF, 0xFF}; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T2T) ) + { + return ERR_PARAM; + } + + if( ctx->state != NDEF_STATE_READWRITE ) + { + return ERR_WRONG_STATE; + } + + /* TS T2T v1.0 7.6.5.1: set the Access Conditions for Write (in the lower nibble) of CC_3 to Fh */ + ctx->cc.t2t.writeAccess = NDEF_T2T_WR_ACCESS_NONE; + ctx->ccBuf[NDEF_T2T_CC_3] |= ctx->cc.t2t.writeAccess; + ret = ndefT2TPollerWriteBlock(ctx, NDEF_T2T_CC_OFFSET/NDEF_T2T_BLOCK_SIZE, ctx->ccBuf); + if( ret != ERR_NONE ) + { + return ret; + } + /* TS T2T v1.0 7.6.5.1: set all Static Lock bits to 1b */ + ret = ndefT2TPollerWriteBytes(ctx, NDEF_T2T_STATLOCK_OFFSET, staticBits, sizeof(staticBits), false, false); + if( ret != ERR_NONE ) + { + return ret; + } + + /* TS T2T v1.0 7.6.5.1: set all Dynamic Lock bits that are associated with the TLVs_Area to 1b */ + if( ctx->areaLen > NDEF_T2T_STATIC_MEM_SIZE ) + { + nbrDynLockBits = (((uint32_t)ctx->cc.t2t.size * NDEF_T2T_SIZE_DIVIDER) - NDEF_T2T_STATIC_MEM_SIZE + ctx->subCtx.t2t.dynLockBytesLockedPerBit - 1U) / ctx->subCtx.t2t.dynLockBytesLockedPerBit; + for( i = 0; i < (nbrDynLockBits / 8U); i++ ) + { + dynLockBits[i] = 0xFFU; + } + nbrDynLockBitsInLastByte = nbrDynLockBits % 8U; + if( nbrDynLockBitsInLastByte != 0U ) + { + dynLockBits[i] = (1U << nbrDynLockBitsInLastByte) -1U; + i++; + } + + maxAddr = ((uint32_t)ctx->cc.t2t.size * NDEF_T2T_SIZE_DIVIDER) + NDEF_T2T_AREA_OFFSET; + /* clear dynLock bits for rsvd Areas */ + for( j = 0; (j < ctx->subCtx.t2t.nbrRsvdAreas) && (ctx->subCtx.t2t.rsvdAreaFirstByteAddr[j] < maxAddr); j++ ) + { + for( addr = ((ctx->subCtx.t2t.rsvdAreaFirstByteAddr[j] + ctx->subCtx.t2t.dynLockBytesLockedPerBit - 1U) / ctx->subCtx.t2t.dynLockBytesLockedPerBit) * ctx->subCtx.t2t.dynLockBytesLockedPerBit; + (addr < (ctx->subCtx.t2t.rsvdAreaFirstByteAddr[j] + ctx->subCtx.t2t.rsvdAreaSize[j])) && ((addr + ctx->subCtx.t2t.dynLockBytesLockedPerBit)< (ctx->subCtx.t2t.rsvdAreaFirstByteAddr[j] + ctx->subCtx.t2t.rsvdAreaSize[j])); + addr += ctx->subCtx.t2t.dynLockBytesLockedPerBit) + { + bitPos = (addr - (NDEF_T2T_STATIC_MEM_SIZE + NDEF_T2T_AREA_OFFSET)) / ctx->subCtx.t2t.dynLockBytesLockedPerBit; + DynLockByteIndex = bitPos / 8U; + if( DynLockByteIndex < NDEF_T2T_DYN_LOCK_BYTES_MAX ) + { + dynLockBits[DynLockByteIndex] &= ~(1U << (bitPos % 8U)); + } + } + } + + ret = ndefT2TPollerWriteBytes(ctx, ctx->subCtx.t2t.dynLockFirstByteAddr, dynLockBits, i, false, false); + if( ret != ERR_NONE ) + { + return ret; + } + } + + return ERR_NONE; +} + +#endif /* NDEF_FEATURE_FULL_API */ + +#endif /* NDEF_FEATURE_T2T */ diff --git a/components/spi-st25r3911b/NDEF/source/poller/ndef_t3t.c b/components/spi-st25r3911b/NDEF/source/poller/ndef_t3t.c new file mode 100644 index 0000000..bc787e5 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/poller/ndef_t3t.c @@ -0,0 +1,973 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief Provides NDEF methods and definitions to access NFC Forum T3T + * + * This module provides an interface to perform as a NFC Reader/Writer + * to handle a Type 3 Tag T3T + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ +#include "ndef_poller.h" +#include "ndef_t3t.h" +#include "utils.h" + +/* + ****************************************************************************** + * ENABLE SWITCH + ****************************************************************************** + */ + +#ifndef NDEF_FEATURE_T3T + #error " NDEF: Module configuration missing. Please enable/disable T3T module by setting: NDEF_FEATURE_T3T" +#endif + +#if NDEF_FEATURE_T3T + +#ifndef NDEF_FEATURE_FULL_API + #error " NDEF: Module configuration missing. Please enable/disable Full API by setting: NDEF_FEATURE_FULL_API" +#endif + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ +#define NDEF_T3T_MAX_DEVICE 1U /*!< T3T maximum number of device for detection */ +#define NDEF_T3T_SYSTEMCODE 0x12FCU /*!< SENSF_RES System Code for T3T TS T3T 1.0 7.1.1.1 */ +#define NDEF_T3T_WRITEFLAG_ON 0xFU /*!< WriteFlag ON value TS T3T 1.0 7.2.2.16 */ +#define NDEF_T3T_WRITEFLAG_OFF 0x0U /*!< WriteFlag OFF value TS T3T 1.0 7.2.2.16 */ +#define NDEF_T3T_AREA_OFFSET 16U /*!< T3T Area starts at block #1 */ +#define NDEF_T3T_BLOCKLEN 16U /*!< T3T block length is always 16 */ +#define NDEF_T3T_FLAG_RW 1U /*!< T3T read/write flag value */ +#define NDEF_T3T_FLAG_RO 0U /*!< T3T read only flag value */ +#define NDEF_T3T_SENSFRES_NFCID2 2U /*!< T3T offset of UID in SENSFRES struct */ +#define NDEF_T3T_ATTRIB_INFO_CHECKSUM_LEN 0xEU /*!< T3T checksum length for attribute info to compute */ +#define NDEF_T3T_ATTRIB_INFO_OFFSET_VERSION 0x0U /*!< T3T attribute info offset of version */ +#define NDEF_T3T_ATTRIB_INFO_OFFSET_NBR 1U /*!< T3T attribute info offset of number of read */ +#define NDEF_T3T_ATTRIB_INFO_OFFSET_NBW 2U /*!< T3T attribute info offset of number of write */ +#define NDEF_T3T_ATTRIB_INFO_OFFSET_MAXB 3U /*!< T3T attribute info offset of MAXB */ +#define NDEF_T3T_ATTRIB_INFO_OFFSET_FLAG_W 9U /*!< T3T attribute info offset of Write flag */ +#define NDEF_T3T_ATTRIB_INFO_OFFSET_FLAG_RW 10U /*!< T3T attribute info offset of Read/Write flag */ +#define NDEF_T3T_ATTRIB_INFO_OFFSET_FLAG_LN 11U /*!< T3T attribute info offset of LN field */ +#define NDEF_T3T_ATTRIB_INFO_VERSION_1_0 0x10U /*!< T3T attribute info full version number */ +#define NDEF_T3T_ATTRIB_INFO_BLOCK_NB 0U /*!< T3T attribute info block number */ +#define NDEF_T3T_BLOCKNB_CONF 0x80U /*!< T3T TxRx config value for Read/Write block */ +#define NDEF_T3T_CHECK_NB_BLOCKS_LEN 1U /*!< T3T Length of the Nb of blocks in the CHECK reply */ + + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + +/* + ****************************************************************************** + * GLOBAL MACROS + ****************************************************************************** + */ + +#define ndefT3TisT3TDevice(device) ((device)->type == RFAL_NFC_LISTEN_TYPE_NFCF) +#define ndefT3TIsWriteFlagON(writeFlag) ((writeFlag) == NDEF_T3T_WRITEFLAG_ON) + +#define ndefT3TLogD(...) /*!< Macro for the debug log method */ + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ +static ndefStatus ndefT3TPollerReadBlocks (ndefContext *ctx, uint16_t blockNum, uint8_t nbBlocks, uint8_t *rxBuf, uint16_t rxBufLen, uint16_t *rcvLen); +static ndefStatus ndefT3TPollerReadAttributeInformationBlock (ndefContext *ctx); + +#if NDEF_FEATURE_FULL_API +static ndefStatus ndefT3TPollerWriteBlocks (ndefContext *ctx, uint16_t blockNum, uint8_t nbBlocks, const uint8_t *dataBlocks); +static ndefStatus ndefT3TPollerWriteAttributeInformationBlock(ndefContext *ctx); +#endif /* NDEF_FEATURE_FULL_API */ + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + +/*******************************************************************************/ +static ndefStatus ndefT3TPollerReadBlocks(ndefContext *ctx, uint16_t blockNum, uint8_t nbBlocks, uint8_t *rxBuf, uint16_t rxBufLen, uint16_t *rcvLen) +{ + ReturnCode ret; + uint16_t requestedDataSize; + rfalNfcfServBlockListParam servBlock; + rfalNfcfBlockListElem* listBlocks; + uint8_t index; + uint16_t rcvdLen = 0U; + rfalNfcfServ serviceCodeLst = 0x000BU; /* serviceCodeLst */ + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T3T) ) + { + return ERR_PARAM; + } + + requestedDataSize = (uint16_t)nbBlocks * NDEF_T3T_BLOCK_SIZE; + if( rxBufLen < requestedDataSize ) + { + return ERR_PARAM; + } + + listBlocks = ctx->subCtx.t3t.listBlocks; + + for (index = 0U; index < nbBlocks; index++ ) + { + /* Write each block number (16 bits per block address) */ + listBlocks[index].blockNum = (uint16_t)( blockNum + (uint16_t) index); + listBlocks[index].conf = ((listBlocks[index].blockNum > 0xFFU) ? 0U : RFAL_NFCF_BLOCKLISTELEM_LEN_BIT); + } + + servBlock.numServ = 1U; + servBlock.servList = &serviceCodeLst; + servBlock.numBlock = nbBlocks; + servBlock.blockList = listBlocks; + + ret = rfalNfcfPollerCheck(ctx->subCtx.t3t.NFCID2, &servBlock, ctx->subCtx.t3t.rxbuf, (uint16_t)sizeof(ctx->subCtx.t3t.rxbuf), &rcvdLen); + if (ret != RFAL_ERR_NONE) + { + return ERR_REQUEST; + } + if( rcvdLen != (uint16_t)(NDEF_T3T_CHECK_NB_BLOCKS_LEN + requestedDataSize) ) + { + return ERR_REQUEST; + } + if( requestedDataSize > 0U ) + { + (void)ST_MEMMOVE( rxBuf, &ctx->subCtx.t3t.rxbuf[NDEF_T3T_CHECK_NB_BLOCKS_LEN], requestedDataSize ); + if (rcvLen != NULL) + { + *rcvLen = requestedDataSize; + } + } + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT3TPollerReadBytes(ndefContext *ctx, uint32_t offset, uint32_t len, uint8_t *buf, uint32_t *rcvdLen) +{ + ndefStatus res = ERR_NONE; + uint16_t nbRead = 0U; + uint32_t currentLen = len; + uint32_t lvRcvLen = 0U; + const uint16_t blockLen = (uint16_t) NDEF_T3T_BLOCKLEN; + uint16_t startBlock = (uint16_t) (offset / blockLen); + uint16_t startAddr = (uint16_t) (startBlock * blockLen); + uint16_t startOffset= (uint16_t) (offset - (uint32_t) startAddr); + uint16_t nbBlocks = (uint16_t) NDEF_T3T_MAX_NB_BLOCKS; + + ndefT3TLogD("ndefT3TPollerReadBytes offset: 0x%8.8x, Len %d\r\n", offset, len); + ndefT3TLogD("ndefT3TPollerReadBytes currentLen: %d, startBlock %d\r\n", currentLen, startBlock); + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T3T) || (len == 0U) ) + { + return ERR_PARAM; + } + if (ctx->state != NDEF_STATE_INVALID) + { + nbBlocks = MIN(ctx->cc.t3t.nbR, NDEF_T3T_MAX_NB_BLOCKS); + } + + if ( startOffset != 0U ) + { + /* Unaligned read, need to use a tmp buffer */ + res = ndefT3TPollerReadBlocks(ctx, startBlock, 1U /* One block */ , ctx->subCtx.t3t.rxbuf, blockLen, &nbRead); + if (res != ERR_NONE) + { + /* Check result */ + return res; + } + if (nbRead != NDEF_T3T_BLOCKLEN) + { + /* Check length */ + return ERR_MEM_CORRUPT; + } + + nbRead = (uint16_t) (nbRead - (uint16_t)startOffset); + if ((uint32_t) nbRead > currentLen) + { + nbRead = (uint16_t) currentLen; + } + if (nbRead > 0U) + { + (void)ST_MEMCPY(buf, &ctx->subCtx.t3t.rxbuf[offset], (uint32_t)nbRead); + } + lvRcvLen += (uint32_t) nbRead; + currentLen -= (uint32_t) nbRead; + startBlock++; + ndefT3TLogD("ndefT3TPollerReadBytes currentLen: %d, startBlock %d\r\n", currentLen, startBlock); + } + + while ( currentLen >= (uint32_t)blockLen ) + { + if ( currentLen < ((uint32_t)blockLen * nbBlocks) ) + { + /* Reduce the nb of blocks to read */ + nbBlocks = (uint16_t) (currentLen / blockLen); + } + res = ndefT3TPollerReadBlocks(ctx, startBlock, (uint8_t)nbBlocks, ctx->subCtx.t3t.rxbuf, blockLen * nbBlocks, &nbRead); + if (res != ERR_NONE) + { + /* Check result */ + return res; + } + if (nbRead != (blockLen * nbBlocks)) + { + /* Check length */ + return ERR_MEM_CORRUPT; + } + (void)ST_MEMCPY(&buf[lvRcvLen], ctx->subCtx.t3t.rxbuf, (uint32_t)currentLen); + lvRcvLen += nbRead; + currentLen -= nbRead; + startBlock += nbBlocks; + ndefT3TLogD("ndefT3TPollerReadBytes currentLen: %d, startBlock %d\r\n", currentLen, startBlock); + } + + if( currentLen > 0U ) + { + /* Unaligned read, need to use a tmp buffer */ + res = ndefT3TPollerReadBlocks(ctx, startBlock, 1U /* One block */, ctx->subCtx.t3t.rxbuf, blockLen, &nbRead); + if (res != ERR_NONE) + { + /* Check result */ + return res; + } + if (nbRead != NDEF_T3T_BLOCKLEN) + { + /* Check length */ + return ERR_MEM_CORRUPT; + } + /* currentLen > 0U */ + (void)ST_MEMCPY(&buf[lvRcvLen], ctx->subCtx.t3t.rxbuf, (uint32_t)currentLen); + lvRcvLen += (uint32_t) currentLen; + currentLen -= (uint32_t) currentLen; + } + + if( currentLen != 0U ) + { + res = ERR_SYSTEM; + } + if( rcvdLen != NULL ) + { + *rcvdLen = lvRcvLen; + } + return res; +} + +/*******************************************************************************/ +static ndefStatus ndefT3TPollerReadAttributeInformationBlock(ndefContext *ctx) +{ + /* Follow 7.4.1 NDEF Detection Procedure */ + ndefStatus retcode; + uint8_t* rxbuf; + uint16_t checksum_received; + uint16_t checksum_computed = 0U; + uint16_t rcvLen = 0U; + uint8_t i; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T3T) ) + { + return ERR_PARAM; + } + rxbuf = ctx->ccBuf; + retcode = ndefT3TPollerReadBlocks( ctx, NDEF_T3T_ATTRIB_INFO_BLOCK_NB, 1U /* One block */, rxbuf, NDEF_T3T_BLOCK_SIZE, &rcvLen ); + if ( (retcode != RFAL_ERR_NONE) && (rcvLen != NDEF_T3T_BLOCK_SIZE) ) + { + return retcode; + } + /* Now compute checksum */ + for(i = 0U; i < NDEF_T3T_ATTRIB_INFO_CHECKSUM_LEN; i++) + { + checksum_computed += (uint16_t) rxbuf[i]; + } + checksum_received = ((uint16_t)rxbuf[NDEF_T3T_ATTRIB_INFO_CHECKSUM_LEN] << 8U) + (uint16_t)rxbuf[NDEF_T3T_ATTRIB_INFO_CHECKSUM_LEN+ 1U]; + if (checksum_received != checksum_computed) + { + return ERR_REQUEST; + } + + /* Now copy the attribute struct */ + ctx->cc.t3t.majorVersion = ( rxbuf[NDEF_T3T_ATTRIB_INFO_OFFSET_VERSION] >> 4U); + ctx->cc.t3t.minorVersion = ( rxbuf[NDEF_T3T_ATTRIB_INFO_OFFSET_VERSION] & 0xFU); + ctx->cc.t3t.nbR = rxbuf[NDEF_T3T_ATTRIB_INFO_OFFSET_NBR]; + ctx->cc.t3t.nbW = rxbuf[NDEF_T3T_ATTRIB_INFO_OFFSET_NBW]; + ctx->cc.t3t.nMaxB = ((uint16_t)rxbuf[NDEF_T3T_ATTRIB_INFO_OFFSET_MAXB] << 8U) + (uint16_t)rxbuf[NDEF_T3T_ATTRIB_INFO_OFFSET_MAXB + 1U]; + ctx->cc.t3t.writeFlag = rxbuf[NDEF_T3T_ATTRIB_INFO_OFFSET_FLAG_W]; + ctx->cc.t3t.rwFlag = rxbuf[NDEF_T3T_ATTRIB_INFO_OFFSET_FLAG_RW]; + ctx->cc.t3t.Ln = ((uint32_t)rxbuf[NDEF_T3T_ATTRIB_INFO_OFFSET_FLAG_LN + 0U] << 0x10U) + | ((uint32_t)rxbuf[NDEF_T3T_ATTRIB_INFO_OFFSET_FLAG_LN + 1U] << 0x8U) + | (uint32_t)rxbuf[NDEF_T3T_ATTRIB_INFO_OFFSET_FLAG_LN + 2U]; + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT3TPollerContextInitialization(ndefContext *ctx, const ndefDevice *dev) +{ + if( (ctx == NULL) || (dev == NULL) || !ndefT3TisT3TDevice(dev) ) + { + return ERR_PARAM; + } + + (void)ST_MEMCPY(&ctx->device, dev, sizeof(ctx->device)); + + ST_MEMCPY(&ctx->subCtx.t3t.NFCID2, dev->dev.nfcf.sensfRes.NFCID2, sizeof(ctx->subCtx.t3t.NFCID2)); + + ctx->type = NDEF_DEV_T3T; + ctx->state = NDEF_STATE_INVALID; + + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT3TPollerNdefDetect(ndefContext *ctx, ndefInfo *info) +{ + ndefStatus err; + ReturnCode retcode; + rfalFeliCaPollRes pollRes[NDEF_T3T_MAX_DEVICE]; + uint8_t devCnt = NDEF_T3T_MAX_DEVICE; + uint8_t collisions = 0U; + + if( info != NULL ) + { + info->state = NDEF_STATE_INVALID; + info->majorVersion = 0U; + info->minorVersion = 0U; + info->areaLen = 0U; + info->areaAvalableSpaceLen = 0U; + info->messageLen = 0U; + } + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T3T) ) + { + return ERR_PARAM; + } + ctx->state = NDEF_STATE_INVALID; + + /* TS T3T v1.0 7.4.1.1 the Reader/Writer SHALL send a SENSF_REQ Command with System Code set to 12FCh. */ + retcode = rfalNfcfPollerPoll( RFAL_FELICA_1_SLOT, NDEF_T3T_SYSTEMCODE, (uint8_t)RFAL_FELICA_POLL_RC_NO_REQUEST, pollRes, &devCnt, &collisions ); + if( retcode != RFAL_ERR_NONE ) + { + /* TS T3T v1.0 7.4.1.2 Conclude procedure. */ + return ERR_REQUEST; + } + + /* Check if UID of the first card is the same */ + if( ST_BYTECMP(&(pollRes[0U][NDEF_T3T_SENSFRES_NFCID2]), ctx->subCtx.t3t.NFCID2, RFAL_NFCF_NFCID2_LEN ) != 0 ) + { + return ERR_REQUEST; /* Wrong UID */ + } + + /* TS T3T v1.0 7.4.1.3 The Reader/Writer SHALL read the Attribute Information Block using the CHECK Command. */ + /* TS T3T v1.0 7.4.1.4 The Reader/Writer SHALL verify the value of Checksum of the Attribute Information Block. */ + err = ndefT3TPollerReadAttributeInformationBlock(ctx); + if( err != ERR_NONE ) + { + return err; + } + + /* TS T3T v1.0 7.4.1.6 The Reader/Writer SHALL check if it supports the NDEF mapping version number based on the rules given in Section 7.3. */ + if( ctx->cc.t3t.majorVersion != ndefMajorVersion(NDEF_T3T_ATTRIB_INFO_VERSION_1_0) ) + { + return ERR_REQUEST; + } + + ctx->messageLen = ctx->cc.t3t.Ln; + ctx->messageOffset = NDEF_T3T_AREA_OFFSET; + ctx->areaLen = (uint32_t)ctx->cc.t3t.nMaxB * NDEF_T3T_BLOCK_SIZE; + if( ctx->messageLen == 0U ) + { + ctx->state = NDEF_STATE_INITIALIZED; + } + else /* ctx->messageLen > 0 */ + { + if( ctx->cc.t3t.rwFlag == NDEF_T3T_FLAG_RW ) + { + ctx->state = NDEF_STATE_READWRITE; + } + else /* NDEF_T3T_FLAG_RO or RFU */ + { + /* TS T3T v1.1 7.2.2.30 The Reader/Writer SHALL interpret an RFU value as Read-Only */ + ctx->state = NDEF_STATE_READONLY; + } + } + + if( info != NULL ) + { + info->state = ctx->state; + info->majorVersion = ctx->cc.t3t.majorVersion; + info->minorVersion = ctx->cc.t3t.minorVersion; + info->areaLen = ctx->areaLen; + info->areaAvalableSpaceLen = ctx->areaLen; + info->messageLen = ctx->messageLen; + } + + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT3TPollerReadRawMessage(ndefContext *ctx, uint8_t *buf, uint32_t bufLen, uint32_t *rcvdLen, bool single) +{ + ndefStatus ret; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T3T) || (buf == NULL) ) + { + return ERR_PARAM; + } + ndefT3TLogD("ndefT3TPollerReadRawMessage messageLen: %d\r\n", ctx->messageLen); + + /* TS T3T v1.0 7.4.2: This procedure assumes that the Reader/Writer has successfully performed the NDEF detection procedure at least once. */ + + if( !single ) + { + ctx->state = NDEF_STATE_INVALID; + ret = ndefT3TPollerReadAttributeInformationBlock(ctx); + if( ret != ERR_NONE ) + { + return ret; + } + ctx->messageLen = ctx->cc.t3t.Ln; + if( ctx->messageLen == 0U ) + { + if( ctx->cc.t3t.rwFlag != NDEF_T3T_FLAG_RW ) + { + return ERR_WRONG_STATE; + } + ctx->state = NDEF_STATE_INITIALIZED; + } + else + { + if( ctx->cc.t3t.rwFlag == NDEF_T3T_FLAG_RW ) + { + ctx->state = NDEF_STATE_READWRITE; + } + else /* NDEF_T3T_FLAG_RO or RFU */ + { + /* TS T3T v1.1 7.2.2.30 The Reader/Writer SHALL interpret an RFU value as Read-Only */ + ctx->state = NDEF_STATE_READONLY; + } + } + } + + if ( ctx->state <= NDEF_STATE_INITIALIZED ) + { + return ERR_WRONG_STATE; + } + /* TS T3T v1.0 7.4.2.1: If the WriteFlag remembered during the NDEF detection procedure is set to ON, the NDEF data may be inconsistent ...*/ + if( ndefT3TIsWriteFlagON(ctx->cc.t3t.writeFlag) ) + { + /* TS T3T v1.0 7.4.2.1: ... the Reader/Writer SHALL conclude the NDEF read procedure */ + return ERR_WRONG_STATE; + } + + if( ctx->messageLen > bufLen ) + { + return ERR_NOMEM; + } + + /* TS T3T v1.0 7.4.2.2: Read NDEF data */ + ret = ndefT3TPollerReadBytes( ctx, ctx->messageOffset, ctx->messageLen, buf, rcvdLen ); + if( ret != ERR_NONE ) + { + ctx->state = NDEF_STATE_INVALID; + } + return ret; +} + +#if NDEF_FEATURE_FULL_API + +/*******************************************************************************/ +static ndefStatus ndefT3TPollerWriteBlocks(ndefContext *ctx, uint16_t blockNum, uint8_t nbBlocks, const uint8_t* dataBlocks) +{ + ReturnCode ret; + rfalNfcfServBlockListParam servBlock; + rfalNfcfBlockListElem* listBlocks; + uint8_t index; + rfalNfcfServ serviceCodeLst = 0x0009U; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T3T) ) + { + return ERR_PARAM; + } + + listBlocks = ctx->subCtx.t3t.listBlocks; + + for (index = 0U; index < nbBlocks; index++) + { + /* Write each block number (16 bits per block address) */ + listBlocks[index].blockNum = (uint16_t)( blockNum + (uint16_t) index); + listBlocks[index].conf = ((listBlocks[index].blockNum > 0xFFU) ? 0U : RFAL_NFCF_BLOCKLISTELEM_LEN_BIT); + } + servBlock.numServ = 1U; + servBlock.servList = &serviceCodeLst; + servBlock.numBlock = nbBlocks; + servBlock.blockList = listBlocks; + + ret = rfalNfcfPollerUpdate( ctx->subCtx.t3t.NFCID2, &servBlock, ctx->subCtx.t3t.txbuf, (uint16_t)sizeof(ctx->subCtx.t3t.txbuf), dataBlocks, ctx->subCtx.t3t.rxbuf, (uint16_t)sizeof(ctx->subCtx.t3t.rxbuf)); + + return (ret == RFAL_ERR_NONE ? ERR_NONE : ERR_REQUEST); +} + +/*******************************************************************************/ +ndefStatus ndefT3TPollerWriteBytes(ndefContext *ctx, uint32_t offset, const uint8_t *buf, uint32_t len, bool pad, bool writeTerminator) +{ + ndefStatus res; + uint16_t nbRead; + uint16_t nbWrite; + uint32_t currentLen = len; + uint32_t txtLen = 0U; + const uint16_t blockLen = (uint16_t) NDEF_T3T_BLOCKLEN; + uint16_t nbBlocks = (uint16_t) NDEF_T3T_MAX_NB_BLOCKS; + uint16_t startBlock = (uint16_t) (offset / blockLen); + uint16_t startAddr = (uint16_t) (startBlock * blockLen); + uint16_t startOffset= (uint16_t) (offset - (uint32_t) startAddr); + uint8_t tmpBuf[NDEF_T3T_BLOCKLEN]; + + NO_WARNING(writeTerminator); /* Unused parameter */ + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T3T) || (len == 0U) ) + { + return ERR_PARAM; + } + if (ctx->state != NDEF_STATE_INVALID) + { + nbBlocks = MIN(ctx->cc.t3t.nbW, NDEF_T3T_MAX_NB_BLOCKS); + } + + if ( startOffset != 0U ) + { + /* Unaligned write, need to use a tmp buffer */ + res = ndefT3TPollerReadBlocks(ctx, startBlock, 1, tmpBuf, blockLen, &nbRead); + if (res != ERR_NONE) + { + /* Check result */ + return res; + } + if (nbRead != blockLen) + { + /* Check length */ + return ERR_REQUEST; + } + /* Fill the rest of the buffer with user data */ + nbWrite = NDEF_T3T_BLOCKLEN - startOffset; + if (nbWrite > len) + { + nbWrite = (uint16_t) len; + } + (void)ST_MEMCPY(&tmpBuf[startOffset], buf, nbWrite); + if ( pad ) + { + startOffset += nbWrite; + nbWrite = NDEF_T3T_BLOCKLEN - startOffset; + if( nbWrite > 0U ) + { + (void)ST_MEMSET(&tmpBuf[startOffset], 0x00, nbWrite); + } + } + res = ndefT3TPollerWriteBlocks(ctx, startBlock, 1U /* One block */, tmpBuf); + if (res != ERR_NONE) + { + return res; + } + txtLen += (uint32_t) nbWrite; + currentLen -= (uint32_t) nbWrite; + startBlock++; + } + while ( currentLen >= (uint32_t)blockLen ) + { + if ( currentLen < ((uint32_t)blockLen * nbBlocks) ) + { + /* Reduce the nb of blocks to read */ + nbBlocks = (uint16_t) (currentLen / blockLen); + } + nbWrite = blockLen * nbBlocks; + res = ndefT3TPollerWriteBlocks(ctx, startBlock, (uint8_t) nbBlocks, &buf[txtLen]); + if (res != ERR_NONE) + { + return res; + } + txtLen += nbWrite; + currentLen -= nbWrite; + startBlock += nbBlocks; + } + if ( currentLen > 0U ) + { + /* Unaligned write, need to use a tmp buffer */ + if( pad ) + { + (void)ST_MEMSET(tmpBuf, 0x00, NDEF_T3T_BLOCKLEN); + } + else + { + res = ndefT3TPollerReadBlocks(ctx, startBlock, 1U /* One block */, tmpBuf, blockLen, &nbRead); + if (res != ERR_NONE) + { + /* Check result */ + return res; + } + if (nbRead != blockLen) + { + /* Check length */ + return ERR_REQUEST; + } + } + /* Fill the beginning of the buffer with user data */ + (void)ST_MEMCPY( tmpBuf, &buf[txtLen], currentLen); + res = ndefT3TPollerWriteBlocks(ctx, startBlock, 1U /* One block */, tmpBuf); + if (res != ERR_NONE) + { + return res; + } + } + + return ERR_NONE; +} + +/*******************************************************************************/ +static ndefStatus ndefT3TPollerWriteAttributeInformationBlock(ndefContext *ctx) +{ + ndefStatus ret; + uint8_t dataIt; + uint16_t checksum; + uint8_t* buf; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T3T) ) + { + return ERR_PARAM; + } + if ( ctx->state < NDEF_STATE_INITIALIZED ) + { + return ERR_WRONG_STATE; + } + dataIt = 0U; + buf = ctx->ccBuf; + checksum = 0U; + buf[dataIt] = ((uint8_t)(ctx->cc.t3t.majorVersion << 4U)) | ctx->cc.t3t.minorVersion; /* Byte 0 Ver */ + checksum += buf[dataIt]; + dataIt++; + buf[dataIt] = ctx->cc.t3t.nbR; /* Byte 1 Nbr */ + checksum += buf[dataIt]; + dataIt++; + buf[dataIt] = ctx->cc.t3t.nbW; /* Byte 2 Nbw */ + checksum += buf[dataIt]; + dataIt++; + buf[dataIt] = (uint8_t)(ctx->cc.t3t.nMaxB >> 8U); /* Byte 3 NmaxB (MSB) */ + checksum += buf[dataIt]; + dataIt++; + buf[dataIt] = (uint8_t)(ctx->cc.t3t.nMaxB >> 0U); /* Byte 4 NmaxB (LSB) */ + checksum += buf[dataIt]; + dataIt++; + buf[dataIt] = 0U; /* Byte 5 RFU */ + dataIt++; + buf[dataIt] = 0U; /* Byte 6 RFU */ + dataIt++; + buf[dataIt] = 0U; /* Byte 7 RFU */ + dataIt++; + buf[dataIt] = 0U; /* Byte 8 RFU */ + dataIt++; + buf[dataIt] = ctx->cc.t3t.writeFlag; /* Byte 9 WriteFlag */ + checksum += buf[dataIt]; + dataIt++; + buf[dataIt] = ctx->cc.t3t.rwFlag; /* Byte 10 RWFlag */ + checksum += buf[dataIt]; + dataIt++; + buf[dataIt] = (uint8_t)(ctx->cc.t3t.Ln >> 16U); /* Byte 11 Ln (MSB) */ + checksum += buf[dataIt]; + dataIt++; + buf[dataIt] = (uint8_t)(ctx->cc.t3t.Ln >> 8U); /* Byte 12 Ln (middle) */ + checksum += buf[dataIt]; + dataIt++; + buf[dataIt] = (uint8_t)(ctx->cc.t3t.Ln >> 0U); /* Byte 13 Ln (LSB) */ + checksum += buf[dataIt]; + dataIt++; + buf[dataIt] = (uint8_t)(checksum >> 8U); /* Byte 14 checksum MSB */ + dataIt++; + buf[dataIt] = (uint8_t)(checksum >> 0U); /* Byte 15 checksum LSB */ + dataIt++; + + ret = ndefT3TPollerWriteBlocks(ctx, NDEF_T3T_ATTRIB_INFO_BLOCK_NB, 1U /* One block */, buf); + return ret; +} + +/*******************************************************************************/ +ndefStatus ndefT3TPollerWriteRawMessage(ndefContext *ctx, const uint8_t *buf, uint32_t bufLen) +{ + ndefStatus ret; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T3T) || ((buf == NULL) && (bufLen != 0U)) ) + { + return ERR_PARAM; + } + /* TS T3T v1.0 7.4.3: This procedure assumes that the Reader/Writer has successfully performed the NDEF detection procedure... */ + /* Warning: current tag content must not be changed between NDEF Detect procedure and NDEF read procedure*/ + + /* TS T3T v1.0 7.4.3: ... and that the RWFlag in the Attribute Information Block is set to 01h. */ + if ( (ctx->state != NDEF_STATE_INITIALIZED) && (ctx->state != NDEF_STATE_READWRITE) ) + { + /* Conclude procedure */ + return ERR_WRONG_STATE; + } + + /* TS T3T v1.0 7.4.3.2: verify available space */ + ret = ndefT3TPollerCheckAvailableSpace(ctx, bufLen); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + return ERR_PARAM; + } + + /* TS T3T v1.0 7.4.3.3: update WriteFlag */ + ret = ndefT3TPollerBeginWriteMessage(ctx, bufLen); + if( ret != ERR_NONE ) + { + ctx->state = NDEF_STATE_INVALID; + /* Conclude procedure */ + return ret; + } + + if( bufLen != 0U ) + { + /* TS T3T v1.0 7.4.3.4: write new NDEF message */ + ret = ndefT3TPollerWriteBytes(ctx, ctx->messageOffset, buf, bufLen, true, false); + if (ret != ERR_NONE) + { + /* Conclude procedure */ + ctx->state = NDEF_STATE_INVALID; + return ret; + } + } + /* TS T3T v1.0 7.4.3.5: update Ln value and set WriteFlag to OFF */ + ret = ndefT3TPollerEndWriteMessage(ctx, bufLen, false); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + ctx->state = NDEF_STATE_INVALID; + return ret; + } + return ret; +} + +/*******************************************************************************/ +ndefStatus ndefT3TPollerTagFormat(ndefContext *ctx, const ndefCapabilityContainer *cc, uint32_t options) +{ + ndefStatus err; + ReturnCode res; + rfalFeliCaPollRes buffOut[NDEF_T3T_MAX_DEVICE]; + uint8_t devCnt = NDEF_T3T_MAX_DEVICE; + uint8_t collisions = 0U; + NO_WARNING(options); /* options not used in T3T */ + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T3T) || (cc == NULL) ) + { + return ERR_PARAM; + } + + /* 4.3.3 System Definition Information for SystemCode = 0x12FC (NDEF) */ + res = rfalNfcfPollerPoll( RFAL_FELICA_1_SLOT, NDEF_T3T_SYSTEMCODE, (uint8_t)RFAL_FELICA_POLL_RC_NO_REQUEST, buffOut, &devCnt, &collisions ); + if (res != RFAL_ERR_NONE) + { + return ERR_REQUEST; + } + res = rfalNfcfPollerPoll( RFAL_FELICA_1_SLOT, NDEF_T3T_SYSTEMCODE, (uint8_t)RFAL_FELICA_POLL_RC_SYSTEM_CODE, buffOut, &devCnt, &collisions ); + if (res != RFAL_ERR_NONE) + { + return ERR_REQUEST; + } + + (void)ST_MEMCPY(&ctx->cc, cc, sizeof(ndefCapabilityContainer)); + + ctx->state = NDEF_STATE_INITIALIZED; /* to be sure that the block will be written */ + ctx->cc.t3t.Ln = 0U; /* Force actual stored NDEF size to 0 */ + ctx->cc.t3t.writeFlag = NDEF_T3T_WRITEFLAG_OFF; /* Force WriteFlag to Off */ + + err = ndefT3TPollerWriteAttributeInformationBlock(ctx); + if (err != ERR_NONE) + { + ctx->state = NDEF_STATE_INVALID; + } + + return err; +} + +/*******************************************************************************/ +ndefStatus ndefT3TPollerCheckPresence(ndefContext *ctx) +{ + ndefStatus retcode; + uint16_t nbRead; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T3T) ) + { + return ERR_PARAM; + } + /* Perform a simple readblock */ + retcode = ndefT3TPollerReadBlocks(ctx, 0U /* First block */, 1U /* One Block */, ctx->subCtx.t3t.rxbuf, NDEF_T3T_BLOCKLEN, &nbRead); + return retcode; +} + +/*******************************************************************************/ +ndefStatus ndefT3TPollerCheckAvailableSpace(const ndefContext *ctx, uint32_t messageLen) +{ + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T3T) ) + { + return ERR_PARAM; + } + + if( ctx->state == NDEF_STATE_INVALID ) + { + return ERR_WRONG_STATE; + } + if( messageLen > ctx->areaLen ) + { + return ERR_NOMEM; + } + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT3TPollerBeginWriteMessage(ndefContext *ctx, uint32_t messageLen) +{ + ndefStatus ret; + NO_WARNING(messageLen); + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T3T) ) + { + return ERR_PARAM; + } + + if( (ctx->state != NDEF_STATE_INITIALIZED) && (ctx->state != NDEF_STATE_READWRITE) ) + { + return ERR_WRONG_STATE; + } + /* Update WriteFlag */ + ctx->cc.t3t.writeFlag = NDEF_T3T_WRITEFLAG_ON; + ret = ndefT3TPollerWriteAttributeInformationBlock(ctx); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + ctx->state = NDEF_STATE_INVALID; + return ret; + } + ctx->state = NDEF_STATE_INITIALIZED; + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT3TPollerEndWriteMessage(ndefContext *ctx, uint32_t messageLen, bool writeTerminator) +{ + ndefStatus ret; + + NO_WARNING(writeTerminator); /* Unused parameter */ + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T3T) ) + { + return ERR_PARAM; + } + if( ctx->state != NDEF_STATE_INITIALIZED ) + { + return ERR_WRONG_STATE; + } + /* TS T3T v1.0 7.4.3.5 Update Attribute Information Block */ + ctx->cc.t3t.writeFlag = NDEF_T3T_WRITEFLAG_OFF; + ctx->cc.t3t.Ln = messageLen; + ret = ndefT3TPollerWriteAttributeInformationBlock(ctx); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + ctx->state = NDEF_STATE_INVALID; + return ret; + } + ctx->messageLen = messageLen; + ctx->state = (ctx->messageLen == 0U) ? NDEF_STATE_INITIALIZED : NDEF_STATE_READWRITE; + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT3TPollerWriteRawMessageLen(ndefContext *ctx, uint32_t rawMessageLen, bool writeTerminator) +{ + NO_WARNING(writeTerminator); /* Unused parameter */ + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T3T) ) + { + return ERR_PARAM; + } + + if( (ctx->state != NDEF_STATE_INITIALIZED) && (ctx->state != NDEF_STATE_READWRITE) ) + { + return ERR_WRONG_STATE; + } + return ndefT3TPollerEndWriteMessage(ctx, rawMessageLen, false); +} + +/*******************************************************************************/ +ndefStatus ndefT3TPollerSetReadOnly(ndefContext *ctx) +{ + ndefStatus ret; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T3T) ) + { + return ERR_PARAM; + } + + if( ctx->state != NDEF_STATE_READWRITE ) + { + return ERR_WRONG_STATE; + } + + /* TS T3T v1.0 7.5.2.4 */ + if( ctx->cc.t3t.writeFlag != NDEF_T3T_WRITEFLAG_OFF ) + { + return ERR_WRONG_STATE; + } + + /* TS T3T v1.0 7.5.2.4 */ + ctx->cc.t3t.rwFlag = NDEF_T3T_FLAG_RO; + ret = ndefT3TPollerWriteAttributeInformationBlock(ctx); + if( ret != ERR_NONE ) + { + return ret; + } + + ctx->state = NDEF_STATE_READONLY; + return ERR_NONE; +} + +#endif /* NDEF_FEATURE_FULL_API */ + +#endif /* NDEF_FEATURE_T3T */ diff --git a/components/spi-st25r3911b/NDEF/source/poller/ndef_t4t.c b/components/spi-st25r3911b/NDEF/source/poller/ndef_t4t.c new file mode 100644 index 0000000..d81f560 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/poller/ndef_t4t.c @@ -0,0 +1,964 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief Provides NDEF methods and definitions to access NFC Forum T4T + * + * This module provides an interface to perform as a NFC Reader/Writer + * to handle a Type 4 Tag T4T + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ +#include "ndef_poller.h" +#include "ndef_t4t.h" +#include "utils.h" + +/* + ****************************************************************************** + * ENABLE SWITCH + ****************************************************************************** + */ + +#ifndef NDEF_FEATURE_T4T + #error " NDEF: Module configuration missing. Please enable/disable T4T module by setting: NDEF_FEATURE_T4T" +#endif + +#if NDEF_FEATURE_T4T + +#if RFAL_FEATURE_ISO_DEP_APDU_MAX_LEN < NDEF_T4T_MIN_APDU_LEN + #error " RFAL: ISO-DEP APDU Max length must be greater than ISO7816 Command/Response-APDU length. Please increase RFAL_FEATURE_ISO_DEP_APDU_MAX_LEN" +#endif + +#ifndef NDEF_FEATURE_FULL_API + #error " NDEF: Module configuration missing. Please enable/disable Full API by setting: NDEF_FEATURE_FULL_API" +#endif + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + +#define NDEF_T4T_FID_SIZE 2U /*!< File Id size */ +#define NDEF_T4T_WRITE_ODO_PREFIX_SIZE 7U /*!< Size of ODO for Write Binary: 54 03 xxyyzz 53 Ld */ + +#define NDEF_T4T_DEFAULT_MLC 0x000DU /*!< Defauit Max Lc value before reading CCFILE values */ +#define NDEF_T4T_DEFAULT_MLE 0x000FU /*!< Defauit Max Le value before reading CCFILE values */ + +#define NDEF_T4T_OFFSET_MAX 0x7FFFU /*!< Maximum offset value for ReadBinary */ +#define NDEF_T4T_ODO_OFFSET_MAX 0xFFFFFEU /*!< Maximum offset value for ReadBinary with ODO */ + +#define NDEF_T4T_CCFILEV2_LEN 15U /*!< CCFILE Length mapping version V2 */ +#define NDEF_T4T_CCFILEV3_LEN 17U /*!< CCFILE Length mapping version V3 */ + +#define NDEF_T4T_NDEF_CTLV_T 0x04U /*!< NDEF-File_Ctrl_TLV T field value */ +#define NDEF_T4T_ENDEF_CTLV_T 0x06U /*!< ENDEF-File_Ctrl_TLV T field value */ + +#define NDEF_T4T_NDEF_CTLV_L 0x06U /*!< NDEF-File_Ctrl_TLV T field value */ +#define NDEF_T4T_ENDEF_CTLV_L 0x08U /*!< ENDEF-File_Ctrl_TLV T field value */ + +#define NDEF_T4T_MIN_VALID_MLE 0x000FU /*!< Min valid MLe. MLe valid range 000Fh-FFFFh */ +#define NDEF_T4T_MIN_VALID_MLC 0x000DU /*!< Min valid MLc. MLc valid range 000Dh-FFFFh */ + +#define NDEF_T4T_NLEN_LEN 2U /*!< NLEN LEN (mapping version v2.0): 2 bytes */ +#define NDEF_T4T_ENLEN_LEN 4U /*!< ENLEN LEN (mapping version v3.0): 4 bytes */ + +#define NDEF_T4T_MIN_NLEN 3U /*!< Minimun non null NLEN value. TS T4T v1.0 B */ + +#define NDEF_T4T_MV2_MAX_OFSSET 0x7FFFU /*!< ReadBinary maximum Offset (offset range 0000-7FFFh)*/ + +#if NDEF_T4T_MAX_RAPDU_BODY_LEN >= 255U +#define NDEF_T4T_MAX_MLE 255U /*!< Maximum MLe value supported in this implementation (short field coding). Le=0 (MLe=256) not supported by some tag. */ +#else +#define NDEF_T4T_MAX_MLE NDEF_T4T_MAX_RAPDU_BODY_LEN +#endif + +#if NDEF_T4T_MAX_CAPDU_BODY_LEN >= 255U +#define NDEF_T4T_MAX_MLC 255U /*!< Maximum MLc value supported in this implementation (short field coding). */ +#else +#define NDEF_T4T_MAX_MLC NDEF_T4T_MAX_CAPDU_BODY_LEN +#endif + +/* + ****************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + +/* + ****************************************************************************** + * GLOBAL MACROS + ****************************************************************************** + */ + +#define ndefT4TisT4TDevice(device) ((((device)->type == RFAL_NFC_LISTEN_TYPE_NFCA) && ((device)->dev.nfca.type == RFAL_NFCA_T4T)) || ((device)->type == RFAL_NFC_LISTEN_TYPE_NFCB)) + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ +static void ndefT4TInitializeIsoDepTxRxParam(ndefContext *ctx, rfalIsoDepApduTxRxParam *isoDepAPDU); +static ndefStatus ndefT4TTransceiveTxRx(ndefContext *ctx, rfalIsoDepApduTxRxParam *isoDepAPDU); +static ndefStatus ndefT4TReadAndParseCCFile(ndefContext *ctx); + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + +/*******************************************************************************/ +static void ndefT4TInitializeIsoDepTxRxParam(ndefContext *ctx, rfalIsoDepApduTxRxParam *isoDepAPDU) +{ + /* Initialize the ISO-DEP protocol transceive context */ + isoDepAPDU->txBuf = &ctx->subCtx.t4t.cApduBuf; + isoDepAPDU->DID = ctx->subCtx.t4t.DID; + isoDepAPDU->FWT = ctx->subCtx.t4t.FWT; + isoDepAPDU->dFWT = ctx->subCtx.t4t.dFWT; + isoDepAPDU->FSx = ctx->subCtx.t4t.FSx; + isoDepAPDU->ourFSx = RFAL_ISODEP_FSX_KEEP; + isoDepAPDU->rxBuf = &ctx->subCtx.t4t.rApduBuf; + isoDepAPDU->tmpBuf = &ctx->subCtx.t4t.tmpBuf; +} + +/*******************************************************************************/ +static ndefStatus ndefT4TTransceiveTxRx(ndefContext *ctx, rfalIsoDepApduTxRxParam *isoDepAPDU) +{ + ReturnCode ret; + + /* Initialize respAPDU */ + ctx->subCtx.t4t.respAPDU.rApduBuf = &ctx->subCtx.t4t.rApduBuf; + isoDepAPDU->rxLen = &ctx->subCtx.t4t.respAPDU.rcvdLen; + + ret = rfalIsoDepStartApduTransceive(*isoDepAPDU); + if( ret == RFAL_ERR_NONE ) + { + do { + /* Blocking implementation, T4T may define rather long timeouts */ + rfalWorker(); + ret = rfalIsoDepGetApduTransceiveStatus(); + } while (ret == RFAL_ERR_BUSY); + } + + if (ret != RFAL_ERR_NONE) + { + return ERR_REQUEST; + } + + ret = rfalT4TPollerParseRAPDU(&ctx->subCtx.t4t.respAPDU); + ctx->subCtx.t4t.rApduBodyLen = ctx->subCtx.t4t.respAPDU.rApduBodyLen; + + return (ret == RFAL_ERR_NONE ? ERR_NONE : ERR_REQUEST); +} + +/*******************************************************************************/ +static ndefStatus ndefT4TReadNlen(ndefContext *ctx) +{ + ndefStatus ret; + uint8_t nlenLen; + uint8_t* nLen; + + ctx->state = NDEF_STATE_INVALID; + nlenLen = ( ndefMajorVersion(ctx->cc.t4t.vNo) == ndefMajorVersion(NDEF_T4T_MAPPING_VERSION_3_0) ) ? NDEF_T4T_ENLEN_LEN : NDEF_T4T_NLEN_LEN; + + /* Read NLEN/ENLEN TS T4T v1.0 7.2.1.11 */ + ret = ndefT4TPollerReadBinary(ctx, 0U, nlenLen); + if( ret != ERR_NONE ) + { + /* Conclude procedure TS T4T v1.0 7.2.1.11 */ + return ret; + } + nLen = ctx->subCtx.t4t.rApduBuf.apdu; + ctx->messageLen = (nlenLen == NDEF_T4T_ENLEN_LEN) ? GETU32(&nLen[0]) : (uint32_t)ndefBytes2Uint16(nLen[0], nLen[1]); + + if ( (ctx->messageLen > (ctx->cc.t4t.fileSize - nlenLen)) || ((ctx->messageLen > 0U) && (ctx->messageLen < NDEF_T4T_MIN_NLEN)) ) + { + /* Conclude procedure TS T4T v1.0 7.2.1.11 */ + return ERR_REQUEST; + } + if( ctx->messageLen == 0U ) + { + if( !(ndefT4TIsWriteAccessGranted(ctx->cc.t4t.writeAccess)) ) + { + /* Conclude procedure TS T4T v1.0 7.2.1.11 */ + return ERR_REQUEST; + } + ctx->state = NDEF_STATE_INITIALIZED; + } + else + { + ctx->state = (ndefT4TIsWriteAccessGranted(ctx->cc.t4t.writeAccess)) ? NDEF_STATE_READWRITE : NDEF_STATE_READONLY; + } + + return ERR_NONE; +} + +/*******************************************************************************/ +static ndefStatus ndefT4TReadAndParseCCFile(ndefContext *ctx) +{ + static const uint8_t RFAL_T4T_FID_CC[] = {0xE1, 0x03}; /*!< FID_CC-File T4T 1.0 4.2 */ + + ndefStatus ret; + uint8_t dataIt; + + /* Select CCFILE TS T4T v1.0 7.2.1.3 */ + ret = ndefT4TPollerSelectFile(ctx, RFAL_T4T_FID_CC); + if( ret != ERR_NONE ) + { + /* Conclude procedure TS T4T v1.0 7.2.1.4 */ + return ret; + } + + /* Read CCFILE TS T4T v1.0 7.2.1.5 */ + /* read CCFILE assuming at least 15 bytes are available. If V3 found will read the extra bytes in a second step */ + ret = ndefT4TPollerReadBinary(ctx, 0U, NDEF_T4T_CCFILEV2_LEN); + if( ret != ERR_NONE ) + { + /* Conclude procedure TS T4T v1.0 7.2.1.6 */ + return ret; + } + (void)ST_MEMCPY(ctx->ccBuf, ctx->subCtx.t4t.rApduBuf.apdu, NDEF_T4T_CCFILEV2_LEN); + dataIt = 0; + ctx->cc.t4t.ccLen = GETU16(&ctx->ccBuf[dataIt]); + dataIt += (uint8_t)sizeof(uint16_t); + ctx->cc.t4t.vNo = ctx->ccBuf[dataIt]; + dataIt++; + ctx->cc.t4t.mLe = GETU16(&ctx->ccBuf[dataIt]); + dataIt += (uint8_t)sizeof(uint16_t); + ctx->cc.t4t.mLc = GETU16(&ctx->ccBuf[dataIt]); + dataIt += (uint8_t)sizeof(uint16_t); + + /* TS T4T v1.0 7.2.1.7 verify MLe and MLc are within the valid range */ + if( (ctx->cc.t4t.mLe < NDEF_T4T_MIN_VALID_MLE) || (ctx->cc.t4t.mLc < NDEF_T4T_MIN_VALID_MLC) ) + { + /* Conclude procedure TS T4T v1.0 7.2.1.8 */ + return ERR_REQUEST; + } + + ctx->subCtx.t4t.curMLe = (uint8_t)MIN(ctx->cc.t4t.mLe, NDEF_T4T_MAX_MLE); /* Only short field codind supported */ + ctx->subCtx.t4t.curMLc = (uint8_t)MIN(ctx->cc.t4t.mLc, NDEF_T4T_MAX_MLC); /* Only short field codind supported */ + + /* TS T4T v1.0 7.2.1.7 and 4.3.2.4 verify support of mapping version */ + if( ndefMajorVersion(ctx->cc.t4t.vNo) > ndefMajorVersion(NDEF_T4T_MAPPING_VERSION_3_0) ) + { + /* Conclude procedure TS T4T v1.0 7.2.1.8 */ + return ERR_REQUEST; + } + if( ndefMajorVersion(ctx->cc.t4t.vNo) == ndefMajorVersion(NDEF_T4T_MAPPING_VERSION_3_0) ) + { + /* V3 found: read remainng bytes */ + ret = ndefT4TPollerReadBinary(ctx, NDEF_T4T_CCFILEV2_LEN, NDEF_T4T_CCFILEV3_LEN - NDEF_T4T_CCFILEV2_LEN); + if( ret != ERR_NONE ) + { + /* Conclude procedure TS T4T v1.0 7.2.1.6 */ + return ret; + } + (void)ST_MEMCPY(&ctx->ccBuf[NDEF_T4T_CCFILEV2_LEN], ctx->subCtx.t4t.rApduBuf.apdu, NDEF_T4T_CCFILEV3_LEN - NDEF_T4T_CCFILEV2_LEN); + + /* TS T4T v1.0 7.2.1.7 verify coding as in table 5 */ + if( ctx->ccBuf[dataIt] != NDEF_T4T_ENDEF_CTLV_T ) + { + /* Conclude procedure TS T4T v1.0 7.2.1.8 */ + return ERR_REQUEST; + } + dataIt++; + if( ctx->ccBuf[dataIt] < NDEF_T4T_ENDEF_CTLV_L ) + { + /* Conclude procedure TS T4T v1.0 7.2.1.8 */ + return ERR_REQUEST; + } + dataIt++; + ctx->cc.t4t.fileId[0U] = ctx->ccBuf[dataIt]; + dataIt++; + ctx->cc.t4t.fileId[1U] = ctx->ccBuf[dataIt]; + dataIt++; + ctx->cc.t4t.fileSize = GETU32(&ctx->ccBuf[dataIt]); + dataIt += (uint8_t)sizeof(uint32_t); + ctx->cc.t4t.readAccess = ctx->ccBuf[dataIt]; + dataIt++; + ctx->cc.t4t.writeAccess = ctx->ccBuf[dataIt]; + dataIt++; + } + else + { + if( ctx->ccBuf[dataIt] != NDEF_T4T_NDEF_CTLV_T ) + { + return ERR_REQUEST; + } + dataIt++; + if( ctx->ccBuf[dataIt] < NDEF_T4T_NDEF_CTLV_L ) + { + return ERR_REQUEST; + } + dataIt++; + ctx->cc.t4t.fileId[0U] = ctx->ccBuf[dataIt]; + dataIt++; + ctx->cc.t4t.fileId[1U] = ctx->ccBuf[dataIt]; + dataIt++; + ctx->cc.t4t.fileSize = ndefBytes2Uint16(ctx->ccBuf[dataIt], ctx->ccBuf[dataIt + 1U]); + dataIt += (uint8_t)sizeof(uint16_t); + ctx->cc.t4t.readAccess = ctx->ccBuf[dataIt]; + dataIt++; + ctx->cc.t4t.writeAccess = ctx->ccBuf[dataIt]; + dataIt++; + } + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT4TPollerSelectNdefTagApplication(ndefContext *ctx) +{ + ndefStatus ret; + rfalIsoDepApduTxRxParam isoDepAPDU; + static const uint8_t NDEF_T4T_AID_NDEF[] = {0xD2, 0x76, 0x00, 0x00, 0x85, 0x01, 0x01}; /*!< AID_NDEF v2.0 or higher T4T 1.0 4.3.3 */ + static const uint8_t NDEF_T4T_AID_NDEF_V1[] = {0xD2, 0x76, 0x00, 0x00, 0x85, 0x01, 0x00}; /*!< AID_NDEF v1.0 T4T 1.0 4.3.3 */ + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T4T) ) + { + return ERR_PARAM; + } + + ndefT4TInitializeIsoDepTxRxParam(ctx, &isoDepAPDU); + (void)rfalT4TPollerComposeSelectAppl(isoDepAPDU.txBuf, NDEF_T4T_AID_NDEF, (uint8_t)sizeof(NDEF_T4T_AID_NDEF), &isoDepAPDU.txBufLen); + ret = ndefT4TTransceiveTxRx(ctx, &isoDepAPDU); + + if( ret == ERR_NONE ) + { + /* application v2 or higher found */ + ctx->subCtx.t4t.mv1Flag = false; + return ret; + } + + if( ret != ERR_REQUEST ) + { + return ret; + } + + /* if v2 application not found, try v1 */ + (void)rfalT4TPollerComposeSelectAppl(isoDepAPDU.txBuf, NDEF_T4T_AID_NDEF_V1, (uint8_t)sizeof(NDEF_T4T_AID_NDEF_V1), &isoDepAPDU.txBufLen); + ret = ndefT4TTransceiveTxRx(ctx, &isoDepAPDU); + + if( ret == ERR_NONE ) + { + /* application v1 found */ + ctx->subCtx.t4t.mv1Flag = true; + } + return ret; +} + +/*******************************************************************************/ +ndefStatus ndefT4TPollerSelectFile(ndefContext *ctx, const uint8_t *fileId) +{ + ndefStatus ret; + rfalIsoDepApduTxRxParam isoDepAPDU; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T4T) ) + { + return ERR_PARAM; + } + + ndefT4TInitializeIsoDepTxRxParam(ctx, &isoDepAPDU); + + if (ctx->subCtx.t4t.mv1Flag) + { + (void)rfalT4TPollerComposeSelectFileV1Mapping(isoDepAPDU.txBuf, fileId, NDEF_T4T_FID_SIZE, &isoDepAPDU.txBufLen); + } + else + { + (void)rfalT4TPollerComposeSelectFile(isoDepAPDU.txBuf, fileId, NDEF_T4T_FID_SIZE, &isoDepAPDU.txBufLen); + } + + ret = ndefT4TTransceiveTxRx(ctx, &isoDepAPDU); + + return ret; +} + + +/*******************************************************************************/ +ndefStatus ndefT4TPollerReadBinary(ndefContext *ctx, uint16_t offset, uint8_t len) +{ + ndefStatus ret; + rfalIsoDepApduTxRxParam isoDepAPDU; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T4T) || (len > ctx->subCtx.t4t.curMLe) || (offset > NDEF_T4T_OFFSET_MAX) ) + { + return ERR_PARAM; + } + + ndefT4TInitializeIsoDepTxRxParam(ctx, &isoDepAPDU); + (void)rfalT4TPollerComposeReadData(isoDepAPDU.txBuf, offset, len, &isoDepAPDU.txBufLen); + ret = ndefT4TTransceiveTxRx(ctx, &isoDepAPDU); + + return ret; +} + +/*******************************************************************************/ +ndefStatus ndefT4TPollerReadBinaryODO(ndefContext *ctx, uint32_t offset, uint8_t len) +{ + ndefStatus ret; + rfalIsoDepApduTxRxParam isoDepAPDU; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T4T) || (len > ctx->subCtx.t4t.curMLe) || (offset > NDEF_T4T_ODO_OFFSET_MAX) ) + { + return ERR_PARAM; + } + + ndefT4TInitializeIsoDepTxRxParam(ctx, &isoDepAPDU); + (void)rfalT4TPollerComposeReadDataODO(isoDepAPDU.txBuf, offset, len, &isoDepAPDU.txBufLen); + ret = ndefT4TTransceiveTxRx(ctx, &isoDepAPDU); + + return ret; +} + +/*******************************************************************************/ +ndefStatus ndefT4TPollerReadBytes(ndefContext *ctx, uint32_t offset, uint32_t len, uint8_t *buf, uint32_t *rcvdLen) +{ + ndefStatus ret; + uint8_t le; + uint32_t lvOffset = offset; + uint32_t lvLen = len; + uint8_t* lvBuf = buf; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T4T) || (lvLen == 0U) ) + { + return ERR_PARAM; + } + if( rcvdLen != NULL ) + { + *rcvdLen = 0U; + } + + do { + le = ( lvLen > ctx->subCtx.t4t.curMLe ) ? ctx->subCtx.t4t.curMLe : (uint8_t)lvLen; + if( lvOffset > NDEF_T4T_MV2_MAX_OFSSET ) + { + ret = ndefT4TPollerReadBinaryODO(ctx, lvOffset, le); + } + else + { + ret = ndefT4TPollerReadBinary(ctx, (uint16_t)lvOffset, le); + } + if( ret != ERR_NONE ) + { + return ret; + } + if( ctx->subCtx.t4t.rApduBodyLen == 0U ) + { + break; /* no more to read */ + } + if( ctx->subCtx.t4t.rApduBodyLen > lvLen ) + { + return ERR_SYSTEM; + } + (void)ST_MEMCPY(lvBuf, ctx->subCtx.t4t.rApduBuf.apdu, ctx->subCtx.t4t.rApduBodyLen); + lvBuf = &lvBuf[ctx->subCtx.t4t.rApduBodyLen]; + lvOffset += ctx->subCtx.t4t.rApduBodyLen; + lvLen -= ctx->subCtx.t4t.rApduBodyLen; + if( rcvdLen != NULL ) + { + *rcvdLen += ctx->subCtx.t4t.rApduBodyLen; + } + } while( lvLen != 0U ); + + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT4TPollerContextInitialization(ndefContext *ctx, const ndefDevice *dev) +{ + if( (ctx == NULL) || (dev == NULL) || !ndefT4TisT4TDevice(dev) ) + { + return ERR_PARAM; + } + + (void)ST_MEMCPY(&ctx->device, dev, sizeof(ctx->device)); + + ctx->type = NDEF_DEV_T4T; + ctx->state = NDEF_STATE_INVALID; + ctx->subCtx.t4t.curMLc = NDEF_T4T_DEFAULT_MLC; + ctx->subCtx.t4t.curMLe = NDEF_T4T_DEFAULT_MLE; + + ctx->subCtx.t4t.DID = dev->proto.isoDep.info.DID; + ctx->subCtx.t4t.FWT = dev->proto.isoDep.info.FWT; + ctx->subCtx.t4t.dFWT = dev->proto.isoDep.info.dFWT; + ctx->subCtx.t4t.FSx = dev->proto.isoDep.info.FSx; + + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT4TPollerNdefDetect(ndefContext *ctx, ndefInfo *info) +{ + ndefStatus ret; + uint8_t nlenLen; + + if( info != NULL ) + { + info->state = NDEF_STATE_INVALID; + info->majorVersion = 0U; + info->minorVersion = 0U; + info->areaLen = 0U; + info->areaAvalableSpaceLen = 0U; + info->messageLen = 0U; + } + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T4T) ) + { + return ERR_PARAM; + } + + ctx->state = NDEF_STATE_INVALID; + + /* Select NDEF Tag application TS T4T v1.0 7.2.1.1 */ + ret = ndefT4TPollerSelectNdefTagApplication(ctx); + if( ret != ERR_NONE ) + { + /* Conclude procedure TS T4T v1.0 7.2.1.2 */ + return ret; + } + + /* TS T4T v1.0 7.2.1.3 and following */ + ret = ndefT4TReadAndParseCCFile(ctx); + if( ret != ERR_NONE ) + { + return ret; + } + nlenLen = ( ndefMajorVersion(ctx->cc.t4t.vNo) == ndefMajorVersion(NDEF_T4T_MAPPING_VERSION_3_0) ) ? NDEF_T4T_ENLEN_LEN : NDEF_T4T_NLEN_LEN; + + /* TS T4T v1.0 7.2.1.7 verify file READ access */ + if( !(ndefT4TIsReadAccessGranted(ctx->cc.t4t.readAccess)) ) + { + /* Conclude procedure TS T4T v1.0 7.2.1.8 */ + return ERR_REQUEST; + } + /* File size need at least be enough to store NLEN or ENLEN */ + if( ctx->cc.t4t.fileSize < nlenLen) + { + return ERR_REQUEST; + } + + /* Select NDEF File TS T4T v1.0 7.2.1.9 */ + ret = ndefT4TPollerSelectFile(ctx, ctx->cc.t4t.fileId); + if( ret != ERR_NONE ) + { + /* Conclude procedure TS T4T v1.0 7.2.1.10 */ + return ret; + } + /* Read NLEN/ENLEN TS T4T v1.0 7.2.1.11 */ + ret = ndefT4TReadNlen(ctx); /* Set ctx->state to NDEF_STATE_INITIALIZED, NDEF_STATE_READWRITE or NDEF_STATE_READONLY */ + if( ret != ERR_NONE ) + { + /* Conclude procedure TS T4T v1.0 7.2.1.11 */ + return ret; + } + ctx->messageOffset = nlenLen; + ctx->areaLen = ctx->cc.t4t.fileSize; + + if( info != NULL ) + { + info->state = ctx->state; + info->majorVersion = ndefMajorVersion(ctx->cc.t4t.vNo); + info->minorVersion = ndefMinorVersion(ctx->cc.t4t.vNo); + info->areaLen = ctx->areaLen; + info->areaAvalableSpaceLen = ctx->areaLen - ctx->messageOffset; + info->messageLen = ctx->messageLen; + } + + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT4TPollerReadRawMessage(ndefContext *ctx, uint8_t *buf, uint32_t bufLen, uint32_t *rcvdLen, bool single) +{ + ndefStatus ret; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T4T) || (buf == NULL) ) + { + return ERR_PARAM; + } + + /* TS T4T v1.0 7.2.2.1: T4T NDEF Detect should have been called at least once before NDEF read procedure */ + + if( !single ) + { + ret = ndefT4TReadNlen(ctx); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + return ret; + } + } + + /* TS T4T v1.0 7.3.3.2: check presence of NDEF message */ + if ( ctx->state <= NDEF_STATE_INITIALIZED ) + { + /* Conclude procedure TS T4T v1.0 7.2.2.2 */ + return ERR_WRONG_STATE; + } + + if( ctx->messageLen > bufLen ) + { + return ERR_NOMEM; + } + + /* TS T4T v1.0 7.3.3.3: read the NDEF message */ + ret = ndefT4TPollerReadBytes(ctx, ctx->messageOffset, ctx->messageLen, buf, rcvdLen); + if( ret != ERR_NONE ) + { + ctx->state = NDEF_STATE_INVALID; + } + + return ret; +} + +#if NDEF_FEATURE_FULL_API + +/*******************************************************************************/ +ndefStatus ndefT4TPollerWriteBinary(ndefContext *ctx, uint16_t offset, const uint8_t *data, uint8_t len) +{ + ndefStatus ret; + rfalIsoDepApduTxRxParam isoDepAPDU; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T4T) || (len > ctx->subCtx.t4t.curMLc) || (offset > NDEF_T4T_OFFSET_MAX) ) + { + return ERR_PARAM; + } + + ndefT4TInitializeIsoDepTxRxParam(ctx, &isoDepAPDU); + (void)rfalT4TPollerComposeWriteData(isoDepAPDU.txBuf, offset, data, len, &isoDepAPDU.txBufLen); + ret = ndefT4TTransceiveTxRx(ctx, &isoDepAPDU); + + return ret; +} + +/*******************************************************************************/ +ndefStatus ndefT4TPollerWriteBinaryODO(ndefContext *ctx, uint32_t offset, const uint8_t *data, uint8_t len) +{ + ndefStatus ret; + rfalIsoDepApduTxRxParam isoDepAPDU; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T4T) || (len > ctx->subCtx.t4t.curMLc) || (offset > NDEF_T4T_ODO_OFFSET_MAX) ) + { + return ERR_PARAM; + } + + ndefT4TInitializeIsoDepTxRxParam(ctx, &isoDepAPDU); + (void)rfalT4TPollerComposeWriteDataODO(isoDepAPDU.txBuf, offset, data, len, &isoDepAPDU.txBufLen); + ret = ndefT4TTransceiveTxRx(ctx, &isoDepAPDU); + + return ret; +} + +/*******************************************************************************/ +ndefStatus ndefT4TPollerWriteBytes(ndefContext *ctx, uint32_t offset, const uint8_t *buf, uint32_t len, bool pad, bool writeTerminator) +{ + ndefStatus ret; + uint8_t lc; + uint32_t lvOffset = offset; + uint32_t lvLen = len; + const uint8_t* lvBuf = buf; + + NO_WARNING(pad); /* Unused parameter */ + NO_WARNING(writeTerminator); /* Unused parameter */ + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T4T) || (lvLen == 0U) ) + { + return ERR_PARAM; + } + + do { + + if( lvOffset > NDEF_T4T_MV2_MAX_OFSSET ) + { + lc = ( lvLen > ((uint32_t)ctx->subCtx.t4t.curMLc - NDEF_T4T_WRITE_ODO_PREFIX_SIZE) ) ? (uint8_t)(ctx->subCtx.t4t.curMLc - NDEF_T4T_WRITE_ODO_PREFIX_SIZE) : (uint8_t)lvLen; + ret = ndefT4TPollerWriteBinaryODO(ctx, lvOffset, lvBuf, lc); + } + else + { + lc = ( lvLen > ctx->subCtx.t4t.curMLc ) ? ctx->subCtx.t4t.curMLc : (uint8_t)lvLen; + ret = ndefT4TPollerWriteBinary(ctx, (uint16_t)lvOffset, lvBuf, lc); + } + if( ret != ERR_NONE ) + { + return ret; + } + lvBuf = &lvBuf[lc]; + lvOffset += lc; + lvLen -= lc; + } while( lvLen != 0U ); + + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT4TPollerWriteRawMessageLen(ndefContext *ctx, uint32_t rawMessageLen, bool writeTerminator) +{ + ndefStatus ret; + uint8_t buf[NDEF_T4T_ENLEN_LEN]; + uint8_t dataIt; + + NO_WARNING(writeTerminator); /* Unused parameter */ + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T4T) ) + { + return ERR_PARAM; + } + + if ( (ctx->state != NDEF_STATE_INITIALIZED) && (ctx->state != NDEF_STATE_READWRITE) ) + { + return ERR_WRONG_STATE; + } + + dataIt = 0U; + if( ndefMajorVersion(ctx->cc.t4t.vNo) == ndefMajorVersion(NDEF_T4T_MAPPING_VERSION_3_0) ) + { + buf[dataIt] = (uint8_t)(rawMessageLen >> 24U); + dataIt++; + buf[dataIt] = (uint8_t)(rawMessageLen >> 16U); + dataIt++; + buf[dataIt] = (uint8_t)(rawMessageLen >> 8U); + dataIt++; + buf[dataIt] = (uint8_t)(rawMessageLen); + dataIt++; + } + else + { + buf[dataIt] = (uint8_t)(rawMessageLen >> 8U); + dataIt++; + buf[dataIt] = (uint8_t)(rawMessageLen); + dataIt++; + } + + ret = ndefT4TPollerWriteBytes(ctx, 0U, buf, dataIt, false, false); + return ret; +} + +/*******************************************************************************/ +ndefStatus ndefT4TPollerWriteRawMessage(ndefContext *ctx, const uint8_t *buf, uint32_t bufLen) +{ + ndefStatus ret; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T4T) || ((buf == NULL) && (bufLen != 0U)) ) + { + return ERR_PARAM; + } + + /* TS T4T v1.0 7.2.3.1: T4T NDEF Detect should have been called before NDEF write procedure */ + /* Warning: current selected file must not be changed between NDEF Detect procedure and NDEF Write procedure*/ + + /* TS T4T v1.0 7.3.3.2: check write access condition */ + if ( (ctx->state != NDEF_STATE_INITIALIZED) && (ctx->state != NDEF_STATE_READWRITE) ) + { + /* Conclude procedure TS T4T v1.0 7.2.3.2 */ + return ERR_WRONG_STATE; + } + + /* TS T4T v1.0 7.2.3.3: check Mapping Version */ + /* Done automatically inside underlying fucntions */ + + /* TS T4T v1.0 7.2.3.4/8 verify length of the NDEF message */ + ret = ndefT4TPollerCheckAvailableSpace(ctx, bufLen); + if( ret != ERR_NONE ) + { + /* Conclude procedure TS T4T v1.0 7.2.3.4/8 */ + return ERR_PARAM; + } + + /* TS T4T v1.0 7.2.3.5/9 Write value 0000h in NLEN field (resp. 00000000h in ENLEN field) */ + ret = ndefT4TPollerBeginWriteMessage(ctx, bufLen); + if( ret != ERR_NONE ) + { + ctx->state = NDEF_STATE_INVALID; + /* Conclude procedure TS T4T v1.0 7.2.3.5/9 */ + return ret; + } + + if( bufLen != 0U ) + { + /* TS T4T v1.0 7.2.3.6/10 Write NDEF message) */ + ret = ndefT4TPollerWriteBytes(ctx, ctx->messageOffset, buf, bufLen, false, false); + if( ret != ERR_NONE ) + { + /* Conclude procedure TS T4T v1.0 7.2.3.6/10 */ + ctx->state = NDEF_STATE_INVALID; + return ret; + } + + /* TS T4T v1.0 7.2.3.7/11 Write value length in NLEN field (resp. in ENLEN field) */ + ret = ndefT4TPollerEndWriteMessage(ctx, bufLen, false); + if( ret != ERR_NONE ) + { + /* Conclude procedure TS T4T v1.0 7.2.3.7/11 */ + ctx->state = NDEF_STATE_INVALID; + return ret; + } + } + + return ret; +} + +/*******************************************************************************/ +ndefStatus ndefT4TPollerTagFormat(ndefContext *ctx, const ndefCapabilityContainer *cc, uint32_t options) +{ + NO_WARNING(ctx); + NO_WARNING(cc); + NO_WARNING(options); + + /* CC is not writable */ + return ERR_NOTSUPP; +} + +/*******************************************************************************/ +ndefStatus ndefT4TPollerCheckPresence(ndefContext *ctx) +{ + rfalIsoDepApduTxRxParam isoDepAPDU; + ReturnCode ret; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T4T) ) + { + return ERR_PARAM; + } + + ndefT4TInitializeIsoDepTxRxParam(ctx, &isoDepAPDU); + (void)rfalT4TPollerComposeReadData(isoDepAPDU.txBuf, 0, 1, &isoDepAPDU.txBufLen); + + /* Initialize respAPDU */ + ctx->subCtx.t4t.respAPDU.rApduBuf = &ctx->subCtx.t4t.rApduBuf; + isoDepAPDU.rxLen = &ctx->subCtx.t4t.respAPDU.rcvdLen; + + (void)rfalIsoDepStartApduTransceive(isoDepAPDU); + do { + /* Blocking implementation, T4T may define rather long timeouts */ + rfalWorker(); + ret = rfalIsoDepGetApduTransceiveStatus(); + } while (ret == RFAL_ERR_BUSY); + + return (ret == RFAL_ERR_NONE ? ERR_NONE : ERR_REQUEST); +} + +/*******************************************************************************/ +ndefStatus ndefT4TPollerCheckAvailableSpace(const ndefContext *ctx, uint32_t messageLen) +{ + uint8_t nlenLen; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T4T) ) + { + return ERR_PARAM; + } + + if ( ctx->state == NDEF_STATE_INVALID ) + { + return ERR_WRONG_STATE; + } + + nlenLen = ( ndefMajorVersion(ctx->cc.t4t.vNo) == ndefMajorVersion(NDEF_T4T_MAPPING_VERSION_3_0) ) ? NDEF_T4T_ENLEN_LEN : NDEF_T4T_NLEN_LEN; + if( (messageLen + (uint32_t)nlenLen) > ctx->cc.t4t.fileSize ) + { + return ERR_NOMEM; + } + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT4TPollerBeginWriteMessage(ndefContext *ctx, uint32_t messageLen) +{ + ndefStatus ret; + NO_WARNING(messageLen); + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T4T) ) + { + return ERR_PARAM; + } + + if( (ctx->state != NDEF_STATE_INITIALIZED) && (ctx->state != NDEF_STATE_READWRITE) ) + { + return ERR_WRONG_STATE; + } + + /* TS T4T v1.0 7.2.3.5/9 Write value 0000h in NLEN field (resp. 00000000h in ENLEN field) */ + ret = ndefT4TPollerWriteRawMessageLen(ctx, 0U, false); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + ctx->state = NDEF_STATE_INVALID; + return ret; + } + + ctx->state = NDEF_STATE_INITIALIZED; + + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT4TPollerEndWriteMessage(ndefContext *ctx, uint32_t messageLen, bool writeTerminator) +{ + ndefStatus ret; + + NO_WARNING(writeTerminator); /* Unused parameter */ + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T4T) ) + { + return ERR_PARAM; + } + + if( ctx->state != NDEF_STATE_INITIALIZED ) + { + return ERR_WRONG_STATE; + } + + /* TS T4T v1.0 7.2.3.7/11 Write value length in NLEN field (resp. in ENLEN field) */ + ret = ndefT4TPollerWriteRawMessageLen(ctx, messageLen, false); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + ctx->state = NDEF_STATE_INVALID; + return ret; + } + ctx->messageLen = messageLen; + ctx->state = (ctx->messageLen == 0U) ? NDEF_STATE_INITIALIZED : NDEF_STATE_READWRITE; + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT4TPollerSetReadOnly(ndefContext *ctx) +{ + NO_WARNING(ctx); + return ERR_NOTSUPP; +} + +#endif /* NDEF_FEATURE_FULL_API */ + +#endif /* NDEF_FEATURE_T4T */ diff --git a/components/spi-st25r3911b/NDEF/source/poller/ndef_t5t.c b/components/spi-st25r3911b/NDEF/source/poller/ndef_t5t.c new file mode 100644 index 0000000..82dafbb --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/poller/ndef_t5t.c @@ -0,0 +1,927 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief Provides NDEF methods and definitions to access NFC-V Forum T5T + * + * This module provides an interface to perform as a NFC-V Reader/Writer + * to handle a Type 5 Tag T5T + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ +#include "ndef_poller.h" +#include "ndef_t5t_hal.h" +#include "ndef_t5t.h" +#include "utils.h" + +/* + ****************************************************************************** + * ENABLE SWITCH + ****************************************************************************** + */ + +#ifndef NDEF_FEATURE_T5T + #error " NDEF: Module configuration missing. Please enable/disable T5T support by setting: NDEF_FEATURE_T5T" +#endif + +#if NDEF_FEATURE_T5T + +#ifndef NDEF_FEATURE_FULL_API + #error " NDEF: Module configuration missing. Please enable/disable Full API by setting: NDEF_FEATURE_FULL_API" +#endif + +#ifdef TEST_NDEF +#define NDEF_SKIP_T5T_SYS_INFO /* Must not call ndefT5TGetSystemInformation() in test mode */ +#endif + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + +#define NDEF_T5T_MLEN_DIVIDER 8U /*!< T5T_area size is measured in bytes is equal to 8 * MLEN */ + +#define NDEF_T5T_TLV_T_LEN 1U /*!< TLV T Length: 1 bytes */ +#define NDEF_T5T_TLV_L_1_BYTES_LEN 1U /*!< TLV L Length: 1 bytes */ +#define NDEF_T5T_TLV_L_3_BYTES_LEN 3U /*!< TLV L Length: 3 bytes */ + +#define NDEF_T5T_MAX_BLOCK_1_BYTE_ADDR 256U /*!< Max number of blocks for 1 byte addressing */ +#define NDEF_T5T_MAX_MLEN_1_BYTE_ENCODING 256U /*!< MLEN max value for 1 byte encoding */ + +#define NDEF_T5T_TL_MIN_SIZE (NDEF_T5T_TLV_T_LEN \ + + NDEF_T5T_TLV_L_1_BYTES_LEN) /*!< Min TL size */ + +#define NDEF_T5T_TL_MAX_SIZE (NDEF_T5T_TLV_T_LEN \ + + NDEF_T5T_TLV_L_3_BYTES_LEN) /*!< Max TL size */ + +#define NDEF_T5T_TLV_NDEF 0x03U /*!< TLV flag NDEF value */ +#define NDEF_T5T_TLV_PROPRIETARY 0xFDU /*!< TLV flag PROPRIETARY value */ +#define NDEF_T5T_TLV_TERMINATOR 0xFEU /*!< TLV flag TERMINATOR value */ +#define NDEF_T5T_TLV_RFU 0x00U /*!< TLV flag RFU value */ + +#define NDEF_T5T_ACCESS_ALWAYS 0x0U /*!< Read/Write Accces. 00b: Always */ +#define NDEF_T5T_ACCESS_RFU 0x1U /*!< Read/Write Accces. 01b: RFU */ +#define NDEF_T5T_ACCESS_PROPRIETARY 0x2U /*!< Read/Write Accces. 00b: Proprietary */ +#define NDEF_T5T_ACCESS_NEVER 0x3U /*!< Read/Write Accces. 00b: Never */ + + +/* + ***************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * GLOBAL MACROS + ****************************************************************************** + */ + + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ +/*! Default T5T Access mode */ +static ndefT5TAccessMode gAccessMode = NDEF_T5T_ACCESS_MODE_SELECTED; + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ + + +#if NDEF_FEATURE_FULL_API +static ndefStatus ndefT5TWriteCC(ndefContext *ctx); +#endif /* NDEF_FEATURE_FULL_API */ + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + +/*******************************************************************************/ +ndefStatus ndefT5TPollerSetAccessMode(ndefT5TAccessMode mode) +{ + gAccessMode = mode; + + return ERR_NONE; +} + +#ifdef TEST_NDEF +/*******************************************************************************/ +ndefStatus ndefT5TPollerMultipleBlockRead(ndefContext *ctx, bool enable) +{ + if ( (ctx == NULL) || (ctx->state != NDEF_STATE_INVALID) ) + { + return ERR_PARAM; + } + + ctx->subCtx.t5t.useMultipleBlockRead = enable; + + return ERR_NONE; +} +#endif /* TEST_NDEF */ + +/*******************************************************************************/ +static ndefStatus ndefT5TReadLField(ndefContext *ctx) +{ + ndefStatus ret; + uint32_t offset; + uint8_t data[3]; + uint16_t lenTLV; + + ctx->state = NDEF_STATE_INVALID; + offset = ctx->subCtx.t5t.TlvNDEFOffset; + offset++; + ret = ndefT5TPollerReadBytes(ctx, offset, 1, data, NULL); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + return ret; + } + offset++; + lenTLV = data[0]; + if( lenTLV == (NDEF_SHORT_VFIELD_MAX_LEN + 1U) ) + { + ret = ndefT5TPollerReadBytes(ctx, offset, 2, data, NULL); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + return ret; + } + offset += 2U; + lenTLV = GETU16(&data[0]); + } + ctx->messageLen = lenTLV; + ctx->messageOffset = offset; + + if (lenTLV == 0U) + { + if ( !((ctx->cc.t5t.readAccess == NDEF_T5T_ACCESS_ALWAYS) && (ctx->cc.t5t.writeAccess == NDEF_T5T_ACCESS_ALWAYS)) ) + { + /* Conclude procedure */ + return ERR_REQUEST; + } + ctx->state = NDEF_STATE_INITIALIZED; + } + else + { + if( !(ctx->cc.t5t.readAccess == NDEF_T5T_ACCESS_ALWAYS) ) + { + /* Conclude procedure */ + return ERR_REQUEST; + } + ctx->state = (ctx->cc.t5t.writeAccess == NDEF_T5T_ACCESS_ALWAYS) ? NDEF_STATE_READWRITE : NDEF_STATE_READONLY; + } + + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT5TPollerContextInitialization(ndefContext *ctx, const ndefDevice *dev) +{ +#if !defined NDEF_SKIP_T5T_SYS_INFO + ndefStatus result; +#endif + + if( (ctx == NULL) || (dev == NULL) ) + { + return ERR_PARAM; + } + if( !ndefT5TisT5TDevice(dev) ) + { + return ERR_PARAM; + } + + (void)ST_MEMCPY(&ctx->device, dev, sizeof(ctx->device)); + + ndefT5TInvalidateCache(ctx); + + /* Reset info about the card */ + ctx->type = NDEF_DEV_T5T; + ctx->state = NDEF_STATE_INVALID; + + /* Initialize CC fields, used in NDEF detect */ + ctx->cc.t5t.ccLen = 0U; + ctx->cc.t5t.magicNumber = 0U; + ctx->cc.t5t.majorVersion = 0U; + ctx->cc.t5t.minorVersion = 0U; + ctx->cc.t5t.readAccess = 0U; + ctx->cc.t5t.writeAccess = 0U; + ctx->cc.t5t.memoryLen = 0U; + ctx->cc.t5t.specialFrame = false; + ctx->cc.t5t.lockBlock = false; + ctx->cc.t5t.mlenOverflow = false; + ctx->cc.t5t.multipleBlockRead = false; + + ctx->subCtx.t5t.blockLen = 0U; + ctx->subCtx.t5t.TlvNDEFOffset = 0U; /* Offset for TLV */ + ctx->subCtx.t5t.useMultipleBlockRead = false; + + ndefT5TPollerAccessMode(ctx, dev, gAccessMode); + + ctx->subCtx.t5t.stDevice = ndefT5TisSTDevice(dev); + + /* Get block length, and set subCtx.t5t.legacySTHighDensity */ + ctx->subCtx.t5t.blockLen = ndefT5TGetBlockLength(ctx); + if( ctx->subCtx.t5t.blockLen == 0U ) + { + return ERR_PROTO; + } + + ctx->subCtx.t5t.sysInfoSupported = false; + +#if !defined NDEF_SKIP_T5T_SYS_INFO + result = ndefT5TGetMemoryConfig(ctx); + if( result != ERR_NONE ) + { + return result; + } +#endif + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT5TPollerNdefDetect(ndefContext *ctx, ndefInfo *info) +{ + ndefStatus result; + uint8_t tmpBuf[NDEF_T5T_TL_MAX_SIZE]; + ndefStatus returnCode = ERR_REQUEST; /* Default return code */ + uint16_t offset; + uint16_t length; + uint32_t TlvOffset; + bool exit; + uint32_t rcvLen; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) ) + { + return ERR_PARAM; + } + + ctx->state = NDEF_STATE_INVALID; + ctx->cc.t5t.ccLen = 0U; + ctx->cc.t5t.memoryLen = 0U; + ctx->cc.t5t.multipleBlockRead = false; + ctx->messageLen = 0U; + ctx->messageOffset = 0U; + ctx->areaLen = 0U; + + if( info != NULL ) + { + info->state = NDEF_STATE_INVALID; + info->majorVersion = 0U; + info->minorVersion = 0U; + info->areaLen = 0U; + info->areaAvalableSpaceLen = 0U; + info->messageLen = 0U; + } + + /* Read the CC with Single Block Read command(s) first and update multipleBlockRead flag later */ + result = ndefT5TPollerReadBytes(ctx, 0U, 4U, ctx->ccBuf, &rcvLen); + if ( (result == ERR_NONE) && (rcvLen == 4U) && ( (ctx->ccBuf[0] == (uint8_t)0xE1U) || (ctx->ccBuf[0] == (uint8_t)0xE2U) ) ) + { + ctx->cc.t5t.magicNumber = ctx->ccBuf[0U]; + ctx->cc.t5t.majorVersion = (ctx->ccBuf[1U] >> 6U ) & 0x03U; + ctx->cc.t5t.minorVersion = (ctx->ccBuf[1U] >> 4U ) & 0x03U; + ctx->cc.t5t.readAccess = (ctx->ccBuf[1U] >> 2U ) & 0x03U; + ctx->cc.t5t.writeAccess = (ctx->ccBuf[1U] >> 0U ) & 0x03U; + ctx->cc.t5t.memoryLen = ctx->ccBuf[2U]; + ctx->cc.t5t.specialFrame = (((ctx->ccBuf[3U] >> 4U ) & 0x01U) != 0U); + ctx->cc.t5t.lockBlock = (((ctx->ccBuf[3U] >> 3U ) & 0x01U) != 0U); + ctx->cc.t5t.mlenOverflow = (((ctx->ccBuf[3U] >> 2U ) & 0x01U) != 0U); + + /* Check Magic Number TS T5T v1.0 - 7.5.1.2 */ + if( (ctx->cc.t5t.magicNumber != NDEF_T5T_CC_MAGIC_1_BYTE_ADDR_MODE) && + (ctx->cc.t5t.magicNumber != NDEF_T5T_CC_MAGIC_2_BYTE_ADDR_MODE) ) + { + return ERR_REQUEST; + } + + /* Check version - 7.5.1.2 */ + if( ctx->cc.t5t.majorVersion > ndefT5TMajorVersion(NDEF_T5T_MAPPING_VERSION_1_0) ) + { + return ERR_REQUEST; + } + + /* Check read access - 7.5.1.2 */ + if( ctx->cc.t5t.readAccess != NDEF_T5T_ACCESS_ALWAYS ) + { + return ERR_REQUEST; + } + + if( ctx->cc.t5t.memoryLen != 0U ) + { + /* 4-byte CC */ + ctx->cc.t5t.ccLen = NDEF_T5T_CC_LEN_4_BYTES; + if( (ctx->cc.t5t.memoryLen == 0xFFU) && ctx->cc.t5t.mlenOverflow ) + { + if( (ctx->subCtx.t5t.sysInfoSupported == true) && (ndefT5TSysInfoMemSizePresent(ctx->subCtx.t5t.sysInfo.infoFlags) != 0U) ) + { + ctx->cc.t5t.memoryLen = (uint16_t)((ctx->subCtx.t5t.sysInfo.numberOfBlock * ctx->subCtx.t5t.sysInfo.blockSize) / NDEF_T5T_MLEN_DIVIDER); + } + } + } + else + { + /* 8-byte CC */ + result = ndefT5TPollerReadBytes(ctx, 4U, 4U, &ctx->ccBuf[4U], &rcvLen); + if ( (result == ERR_NONE) && (rcvLen == 4U) ) + { + ctx->cc.t5t.ccLen = NDEF_T5T_CC_LEN_8_BYTES; + ctx->cc.t5t.memoryLen = ((uint16_t)ctx->ccBuf[6U] << 8U) + (uint16_t)ctx->ccBuf[7U]; + } + } + + /* Update multipleBlockRead flag after having read the second half of 8-byte CC */ + ctx->cc.t5t.multipleBlockRead = (((ctx->ccBuf[3U] >> 0U ) & 0x01U) != 0U); + + if( (ctx->subCtx.t5t.sysInfoSupported == true) && + (ndefT5TSysInfoMemSizePresent(ctx->subCtx.t5t.sysInfo.infoFlags) != 0U) && + (ctx->cc.t5t.memoryLen == (uint16_t)((ctx->subCtx.t5t.sysInfo.numberOfBlock * ctx->subCtx.t5t.sysInfo.blockSize) / NDEF_T5T_MLEN_DIVIDER)) && + (ctx->cc.t5t.memoryLen > 0U) ) + { + ctx->cc.t5t.memoryLen--; /* remove CC area from memory length */ + } + + ctx->messageLen = 0U; + ctx->messageOffset = ctx->cc.t5t.ccLen; + /* TS T5T v1.0 4.3.1.17 T5T_Area size is measured in bytes, is equal to MLEN * 8 */ + ctx->areaLen = (uint32_t)ctx->cc.t5t.memoryLen * NDEF_T5T_MLEN_DIVIDER; + + TlvOffset = ctx->cc.t5t.ccLen; + exit = false; + while( (exit == false) && (TlvOffset < (ctx->cc.t5t.ccLen + ctx->areaLen)) ) + { + result = ndefT5TPollerReadBytes(ctx, TlvOffset, NDEF_T5T_TL_MIN_SIZE, tmpBuf, &rcvLen); + if ( (result != ERR_NONE) || ( rcvLen != NDEF_T5T_TL_MIN_SIZE) ) + { + return result; + } + offset = NDEF_T5T_TLV_T_LEN + NDEF_T5T_TLV_L_1_BYTES_LEN; + length = tmpBuf[1U]; + if ( length == (NDEF_SHORT_VFIELD_MAX_LEN + 1U) ) + { + /* Size is encoded in 1 + 2 bytes */ + result = ndefT5TPollerReadBytes(ctx, TlvOffset, NDEF_T5T_TL_MAX_SIZE, tmpBuf, &rcvLen); + if ( (result != ERR_NONE) || ( rcvLen != NDEF_T5T_TL_MAX_SIZE) ) + { + return result; + } + length = (((uint16_t)tmpBuf[2U]) << 8U) + (uint16_t)tmpBuf[3U]; + offset += 2U; + } + if (tmpBuf[0U] == (uint8_t)NDEF_T5T_TLV_NDEF) + { + /* NDEF record return it */ + returnCode = ERR_NONE; /* Default */ + ctx->subCtx.t5t.TlvNDEFOffset = TlvOffset; /* Offset for TLV */ + ctx->messageOffset = TlvOffset + offset; + ctx->messageLen = length; + if (length == 0U) + { + /* Req 40 7.5.1.6 */ + if ( (ctx->cc.t5t.readAccess == NDEF_T5T_ACCESS_ALWAYS) && + (ctx->cc.t5t.writeAccess == NDEF_T5T_ACCESS_ALWAYS) ) + { + ctx->state = NDEF_STATE_INITIALIZED; + } + else + { + ctx->state = NDEF_STATE_INVALID; + returnCode = ERR_REQUEST; /* Default */ + } + exit = true; + } + else + { + if (ctx->cc.t5t.readAccess == NDEF_T5T_ACCESS_ALWAYS) + { + if (ctx->cc.t5t.writeAccess == NDEF_T5T_ACCESS_ALWAYS) + { + ctx->state = NDEF_STATE_READWRITE; + } + else + { + ctx->state = NDEF_STATE_READONLY; + } + } + exit = true; + } + } + else if (tmpBuf[0U]== (uint8_t) NDEF_T5T_TLV_TERMINATOR) + { + /* NDEF end */ + exit = true; + } + else + { + /* Skip Proprietary and RFU too */ + TlvOffset += (uint32_t)offset + (uint32_t)length; + } + } + } + else + { + /* No CC File */ + returnCode = ERR_REQUEST; + if (result != ERR_NONE) + { + returnCode = result; + } + } + + if( info != NULL ) + { + info->state = ctx->state; + info->majorVersion = ctx->cc.t5t.majorVersion; + info->minorVersion = ctx->cc.t5t.minorVersion; + info->areaLen = ctx->areaLen; + info->areaAvalableSpaceLen = (uint32_t)ctx->cc.t5t.ccLen + ctx->areaLen - ctx->messageOffset; + info->messageLen = ctx->messageLen; + } + return returnCode; +} + +/*******************************************************************************/ +ndefStatus ndefT5TPollerReadRawMessage(ndefContext *ctx, uint8_t *buf, uint32_t bufLen, uint32_t *rcvdLen, bool single) +{ + ndefStatus result; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) || (buf == NULL) ) + { + return ERR_PARAM; + } + + if( !single ) + { + ndefT5TInvalidateCache(ctx); + result = ndefT5TReadLField(ctx); + if( result != ERR_NONE ) + { + /* Conclude procedure */ + return result; + } + } + + if ( ctx->state <= NDEF_STATE_INITIALIZED ) + { + /* Conclude procedure */ + return ERR_WRONG_STATE; + } + + if( ctx->messageLen > bufLen ) + { + return ERR_NOMEM; + } + + result = ndefT5TPollerReadBytes(ctx, ctx->messageOffset, ctx->messageLen, buf, rcvdLen); + if( result != ERR_NONE ) + { + ctx->state = NDEF_STATE_INVALID; + } + return result; +} + +#if NDEF_FEATURE_FULL_API + +/*******************************************************************************/ +ndefStatus ndefT5TPollerWriteRawMessageLen(ndefContext *ctx, uint32_t rawMessageLen, bool writeTerminator) +{ + uint8_t TLV[8U]; + ndefStatus result; + uint8_t len; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) ) + { + return ERR_PARAM; + } + + if( (ctx->state != NDEF_STATE_INITIALIZED) && (ctx->state != NDEF_STATE_READWRITE) ) + { + return ERR_WRONG_STATE; + } + + if( writeTerminator && (rawMessageLen != 0U) && ((ctx->messageOffset + rawMessageLen) < ctx->areaLen) ) + { + /* Write T5T TLV terminator */ + len = 0U; + TLV[len] = NDEF_TERMINATOR_TLV_T; /* TLV terminator */ + len++; + result = ndefT5TPollerWriteBytes(ctx, ctx->messageOffset + rawMessageLen, TLV, len, true, false); + if (result != ERR_NONE) + { + return result; + } + } + + /* Prepare L buffer content - Don't need to write T byte so skip it */ + len = 0U; + if( rawMessageLen <= NDEF_SHORT_VFIELD_MAX_LEN ) + { + TLV[len] = (uint8_t) rawMessageLen; + len++; + } + else + { + TLV[len] = (uint8_t)(NDEF_SHORT_VFIELD_MAX_LEN + 1U); + len++; + TLV[len] = (uint8_t) (rawMessageLen >> 8U); + len++; + TLV[len] = (uint8_t) rawMessageLen; + len++; + } + if( writeTerminator && (rawMessageLen == 0U) ) + { + TLV[len] = NDEF_TERMINATOR_TLV_T; /* TLV terminator */ + len++; + } + + result = ndefT5TPollerWriteBytes(ctx, ctx->subCtx.t5t.TlvNDEFOffset + NDEF_T5T_TLV_T_LEN, TLV, len, writeTerminator && (rawMessageLen == 0U), false); + + return result; +} + +/*******************************************************************************/ +ndefStatus ndefT5TPollerWriteRawMessage(ndefContext *ctx, const uint8_t *buf, uint32_t bufLen) +{ + uint32_t len = bufLen; + ndefStatus result; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) || (buf == NULL) ) + { + return ERR_PARAM; + } + + /* TS T5T v1.0 7.5.3.1/2: T5T NDEF Detect should have been called before NDEF write procedure */ + /* Warning: current tag content must not be changed between NDEF Detect procedure and NDEF Write procedure*/ + + /* TS T5T v1.0 7.5.3.3: check write access condition */ + if ( (ctx->state != NDEF_STATE_INITIALIZED) && (ctx->state != NDEF_STATE_READWRITE) ) + { + /* Conclude procedure */ + return ERR_WRONG_STATE; + } + + /* TS T5T v1.0 7.5.3.3: verify available space */ + result = ndefT5TPollerCheckAvailableSpace(ctx, bufLen); + if( result != ERR_NONE ) + { + /* Conclude procedure */ + return ERR_PARAM; + } + /* TS T5T v1.0 7.5.3.4: reset L-Field to 0 */ + /* and update ctx->messageOffset according to L-field len */ + result = ndefT5TPollerBeginWriteMessage(ctx, bufLen); + if (result != ERR_NONE) + { + ctx->state = NDEF_STATE_INVALID; + /* Conclude procedure */ + return result; + } + if( bufLen != 0U ) + { + /* TS T5T v1.0 7.5.3.5: write new NDEF message and write terminator TLV is enough space for it*/ + result = ndefT5TPollerWriteBytes(ctx, ctx->messageOffset, buf, len, true, ndefT5TPollerCheckAvailableSpace(ctx, bufLen + 1U) == ERR_NONE); + if (result != ERR_NONE) + { + /* Conclude procedure */ + ctx->state = NDEF_STATE_INVALID; + return result; + } + /* TS T5T v1.0 7.5.3.6 & 7.5.3.7: update L-Field and write Terminator TLV */ + result = ndefT5TPollerEndWriteMessage(ctx, len, false); + if (result != ERR_NONE) + { + /* Conclude procedure */ + ctx->state = NDEF_STATE_INVALID; + return result; + } + } + return result; +} + +/*******************************************************************************/ +static ndefStatus ndefT5TWriteCC(ndefContext *ctx) +{ + ndefStatus ret; + uint8_t* buf; + uint8_t dataIt; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) ) + { + return ERR_PARAM; + } + + buf = ctx->ccBuf; + dataIt = 0U; + /* Encode CC */ + buf[dataIt] = ctx->cc.t5t.magicNumber; /* Byte 0 */ + dataIt++; + buf[dataIt] = (uint8_t)(((ctx->cc.t5t.majorVersion & 0x03U) << 6) | /* Byte 1 */ + ((ctx->cc.t5t.minorVersion & 0x03U) << 4) | /* */ + ((ctx->cc.t5t.readAccess & 0x03U) << 2) | /* */ + ((ctx->cc.t5t.writeAccess & 0x03U) << 0)); /* */ + dataIt++; + buf[dataIt] = (ctx->cc.t5t.ccLen == NDEF_T5T_CC_LEN_8_BYTES) ? 0U : (uint8_t)ctx->cc.t5t.memoryLen; /* Byte 2 */ + dataIt++; + buf[dataIt] = 0U; /* Byte 3 */ + if( ctx->cc.t5t.multipleBlockRead ) { buf[dataIt] |= 0x01U; } /* Byte 3 b0 MBREAD */ + if( ctx->cc.t5t.mlenOverflow ) { buf[dataIt] |= 0x04U; } /* Byte 3 b2 Android MLEN overflow */ + if( ctx->cc.t5t.lockBlock ) { buf[dataIt] |= 0x08U; } /* Byte 3 b3 Lock Block */ + if( ctx->cc.t5t.specialFrame ) { buf[dataIt] |= 0x10U; } /* Byte 3 b4 Special Frame */ + dataIt++; + if( ctx->cc.t5t.ccLen == NDEF_T5T_CC_LEN_8_BYTES ) + { + buf[dataIt] = 0U; /* Byte 4 */ + dataIt++; + buf[dataIt] = 0U; /* Byte 5 */ + dataIt++; + buf[dataIt] = (uint8_t)(ctx->cc.t5t.memoryLen >> 8); /* Byte 6 */ + dataIt++; + buf[dataIt] = (uint8_t)(ctx->cc.t5t.memoryLen >> 0); /* Byte 7 */ + dataIt++; + } + + ret = ndefT5TPollerWriteBytes(ctx, 0U, buf, ctx->cc.t5t.ccLen, false, false); + return ret; +} + +/*******************************************************************************/ +ndefStatus ndefT5TPollerTagFormat(ndefContext *ctx, const ndefCapabilityContainer *cc, uint32_t options) +{ + ndefStatus result; + static const uint8_t emptyNDEF[] = { 0x03U, 0x00U }; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) ) + { + return ERR_PARAM; + } + + /* Reset previous potential info about NDEF messages */ + ctx->messageLen = 0U; + ctx->messageOffset = 0U; + ctx->subCtx.t5t.TlvNDEFOffset = 0U; + + if( cc != NULL ) + { + if( (cc->t5t.ccLen != NDEF_T5T_CC_LEN_8_BYTES) && (cc->t5t.ccLen != NDEF_T5T_CC_LEN_4_BYTES) ) + { + return ERR_PARAM; + } + (void)ST_MEMCPY(&ctx->cc, cc, sizeof(ndefCapabilityContainer)); + } + else + { + /* Try to find the appropriate cc values */ + ctx->cc.t5t.magicNumber = NDEF_T5T_CC_MAGIC_1_BYTE_ADDR_MODE; /* E1 */ + ctx->cc.t5t.majorVersion = ndefT5TMajorVersion(NDEF_T5T_MAPPING_VERSION_1_0); + ctx->cc.t5t.minorVersion = ndefT5TMinorVersion(NDEF_T5T_MAPPING_VERSION_1_0); + ctx->cc.t5t.readAccess = NDEF_T5T_ACCESS_ALWAYS; + ctx->cc.t5t.writeAccess = NDEF_T5T_ACCESS_ALWAYS; + + ctx->cc.t5t.specialFrame = false; + ctx->cc.t5t.lockBlock = false; + ctx->cc.t5t.memoryLen = 0U; + ctx->cc.t5t.mlenOverflow = false; + + ctx->cc.t5t.multipleBlockRead = ndefT5TIsMultipleBlockReadSupported(ctx); + + /* Try to retrieve the tag's size using getSystemInfo and GetExtSystemInfo */ + if( (ctx->subCtx.t5t.sysInfoSupported == false) || (ndefT5TSysInfoMemSizePresent(ctx->subCtx.t5t.sysInfo.infoFlags) == 0U) ) + { + return ERR_REQUEST; + } + ctx->cc.t5t.memoryLen = (uint16_t)((ctx->subCtx.t5t.sysInfo.numberOfBlock * ctx->subCtx.t5t.sysInfo.blockSize) / NDEF_T5T_MLEN_DIVIDER); + + if( (options & NDEF_T5T_FORMAT_OPTION_NFC_FORUM) == NDEF_T5T_FORMAT_OPTION_NFC_FORUM ) /* NFC Forum format */ + { + if( ctx->cc.t5t.memoryLen >= NDEF_T5T_MAX_MLEN_1_BYTE_ENCODING ) + { + ctx->cc.t5t.ccLen = NDEF_T5T_CC_LEN_8_BYTES; + } + if( ctx->cc.t5t.memoryLen > 0U ) + { + ctx->cc.t5t.memoryLen--; /* remove CC area from memory length */ + } + } + else /* Android format */ + { + ctx->cc.t5t.ccLen = NDEF_T5T_CC_LEN_4_BYTES; + if( ctx->cc.t5t.memoryLen >= NDEF_T5T_MAX_MLEN_1_BYTE_ENCODING ) + { + ctx->cc.t5t.mlenOverflow = true; + ctx->cc.t5t.memoryLen = 0xFFU; + } + } + + if( !ctx->subCtx.t5t.legacySTHighDensity && (ctx->subCtx.t5t.sysInfo.numberOfBlock > NDEF_T5T_MAX_BLOCK_1_BYTE_ADDR) ) + { + ctx->cc.t5t.magicNumber = NDEF_T5T_CC_MAGIC_2_BYTE_ADDR_MODE; /* E2 */ + } + } + + result = ndefT5TWriteCC(ctx); + if( result != ERR_NONE ) + { + /* If write fails, try to use special frame if not yet used */ + if( !ctx->cc.t5t.specialFrame ) + { + platformDelay(20U); /* Wait to be sure that previous command has ended */ + ctx->cc.t5t.specialFrame = true; /* Add option flag */ + result = ndefT5TWriteCC(ctx); + if( result != ERR_NONE ) + { + ctx->cc.t5t.specialFrame = false; /* Add option flag */ + return result; + } + } + else + { + return result; + } + } + + /* Update info about current NDEF */ + + ctx->subCtx.t5t.TlvNDEFOffset = ctx->cc.t5t.ccLen; + + result = ndefT5TPollerWriteBytes(ctx, ctx->subCtx.t5t.TlvNDEFOffset, emptyNDEF, sizeof(emptyNDEF), true, true); + if( result == ERR_NONE ) + { + /* Update info about current NDEF */ + ctx->messageOffset = (uint32_t)ctx->cc.t5t.ccLen + NDEF_T5T_TLV_T_LEN + NDEF_T5T_TLV_L_1_BYTES_LEN; + ctx->state = NDEF_STATE_INITIALIZED; + } + return result; +} + +/*******************************************************************************/ +ndefStatus ndefT5TPollerCheckPresence(ndefContext *ctx) +{ + ndefStatus ret; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) ) + { + return ERR_PARAM; + } + + ret = ndefT5TIsDevicePresent(ctx); + + return ret; +} + + +/*******************************************************************************/ +ndefStatus ndefT5TPollerCheckAvailableSpace(const ndefContext *ctx, uint32_t messageLen) +{ + uint32_t lLen; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) ) + { + return ERR_PARAM; + } + + if ( ctx->state == NDEF_STATE_INVALID ) + { + return ERR_WRONG_STATE; + } + + lLen = ( messageLen > NDEF_SHORT_VFIELD_MAX_LEN) ? NDEF_T5T_TLV_L_3_BYTES_LEN : NDEF_T5T_TLV_L_1_BYTES_LEN; + + if( (messageLen + ctx->subCtx.t5t.TlvNDEFOffset + NDEF_T5T_TLV_T_LEN + lLen) > (ctx->areaLen + ctx->cc.t5t.ccLen) ) + { + return ERR_NOMEM; + } + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT5TPollerBeginWriteMessage(ndefContext *ctx, uint32_t messageLen) +{ + ndefStatus ret; + uint32_t lLen; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) ) + { + return ERR_PARAM; + } + + if( (ctx->state != NDEF_STATE_INITIALIZED) && (ctx->state != NDEF_STATE_READWRITE) ) + { + return ERR_WRONG_STATE; + } + + /* TS T5T v1.0 7.5.3.4: reset L-Field to 0 */ + ret = ndefT5TPollerWriteRawMessageLen(ctx, 0U, true); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + ctx->state = NDEF_STATE_INVALID; + return ret; + } + + lLen = ( messageLen > NDEF_SHORT_VFIELD_MAX_LEN) ? NDEF_T5T_TLV_L_3_BYTES_LEN : NDEF_T5T_TLV_L_1_BYTES_LEN; + ctx->messageOffset = ctx->subCtx.t5t.TlvNDEFOffset; + ctx->messageOffset += NDEF_T5T_TLV_T_LEN; /* T Length */ + ctx->messageOffset += lLen; /* L Length */ + ctx->state = NDEF_STATE_INITIALIZED; + + return ERR_NONE; +} + +/*******************************************************************************/ +ndefStatus ndefT5TPollerEndWriteMessage(ndefContext *ctx, uint32_t messageLen, bool writeTerminator) +{ + ndefStatus ret; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) ) + { + return ERR_PARAM; + } + + if( ctx->state != NDEF_STATE_INITIALIZED ) + { + return ERR_WRONG_STATE; + } + + /* TS T5T v1.0 7.5.3.6 & 7.5.3.7: update L-Field and write Terminator TLV */ + ret = ndefT5TPollerWriteRawMessageLen(ctx, messageLen, writeTerminator); + if( ret != ERR_NONE ) + { + /* Conclude procedure */ + ctx->state = NDEF_STATE_INVALID; + return ret; + } + ctx->messageLen = messageLen; + ctx->state = (ctx->messageLen == 0U) ? NDEF_STATE_INITIALIZED : NDEF_STATE_READWRITE; + return ERR_NONE; +} + + +/*******************************************************************************/ +ndefStatus ndefT5TPollerSetReadOnly(ndefContext *ctx) +{ + ndefStatus ret; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) ) + { + return ERR_PARAM; + } + + if( ctx->state != NDEF_STATE_READWRITE ) + { + return ERR_WRONG_STATE; + } + + /* Change write access */ + ctx->cc.t5t.writeAccess = NDEF_T5T_ACCESS_NEVER; + + ret = ndefT5TWriteCC(ctx); + if( ret != ERR_NONE ) + { + return ret; + } + + ret = ndefT5TLockDevice(ctx); + if( ret != ERR_NONE ) + { + return ret; + } + return ERR_NONE; +} + +#endif /* NDEF_FEATURE_FULL_API */ + +#endif /* NDEF_FEATURE_T5T */ diff --git a/components/spi-st25r3911b/NDEF/source/poller/ndef_t5t_rf.c b/components/spi-st25r3911b/NDEF/source/poller/ndef_t5t_rf.c new file mode 100644 index 0000000..71c8212 --- /dev/null +++ b/components/spi-st25r3911b/NDEF/source/poller/ndef_t5t_rf.c @@ -0,0 +1,871 @@ +/****************************************************************************** + * @attention + * + * COPYRIGHT 2019 STMicroelectronics, all rights reserved + * + * 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, + * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. + * See the License for the specific language governing permissions and + * limitations under the License. + * +******************************************************************************/ + +/* + * PROJECT: NDEF firmware + * Revision: + * LANGUAGE: ISO C99 + */ + +/*! \file + * + * \author + * + * \brief Provides NDEF methods and definitions to access NFC-V Forum T5T + * + * This module provides an interface to perform as a NFC-V Reader/Writer + * to handle a Type 5 Tag T5T + * + */ + +/* + ****************************************************************************** + * INCLUDES + ****************************************************************************** + */ +#include "ndef_t5t_hal.h" +#include "ndef_t5t.h" +#include "utils.h" +#include "rfal_st25xv.h" + +/* + ****************************************************************************** + * ENABLE SWITCH + ****************************************************************************** + */ + +#ifndef NDEF_FEATURE_T5T + #error " NDEF: Module configuration missing. Please enable/disable T5T support by setting: NDEF_FEATURE_T5T" +#endif + +#if NDEF_FEATURE_T5T + +#ifndef NDEF_FEATURE_FULL_API + #error " NDEF: Module configuration missing. Please enable/disable Full API by setting: NDEF_FEATURE_FULL_API" +#endif + +#ifdef TEST_NDEF +#define NDEF_SKIP_T5T_SYS_INFO /* Must not call ndefT5TGetSystemInformation() in test mode */ +#endif + +/* + ****************************************************************************** + * GLOBAL DEFINES + ****************************************************************************** + */ + +#define NDEF_T5T_SYSINFO_MAX_LEN 22U /*!< Max length for (Extended) Get System Info response */ + +#define NDEF_T5T_MAX_BLOCK_1_BYTE_ADDR 256U /*!< Max number of blocks for 1 byte addressing */ + + +#ifndef NDEF_T5T_N_RETRY_ERROR +#define NDEF_T5T_N_RETRY_ERROR 2U /*!< nT5T,RETRY,ERROR DP 2.2 B.12 */ +#endif /* NDEF_T5T_N_RETRY_ERROR */ + +#define NDEF_T5T_FLAG_LEN 1U /*!< Flag byte length */ + + +/* + ***************************************************************************** + * GLOBAL TYPES + ****************************************************************************** + */ + +#define NDEF_T5T_UID_MANUFACTURER_ID_POS 6U /*!< Manufacturer ID Offset in UID buffer (reverse) */ +#define NDEF_T5T_MANUFACTURER_ID_ST 0x02U /*!< Manufacturer ID for ST */ + + +/* + ****************************************************************************** + * GLOBAL MACROS + ****************************************************************************** + */ + +#define rfalT5TIsTransmissionError(err) ( ((err) == RFAL_ERR_FRAMING) || ((err) == RFAL_ERR_CRC) || ((err) == RFAL_ERR_PAR) || ((err) == RFAL_ERR_TIMEOUT) ) + + +/* + ****************************************************************************** + * LOCAL VARIABLES + ****************************************************************************** + */ + +/* + ****************************************************************************** + * LOCAL FUNCTION PROTOTYPES + ****************************************************************************** + */ +static ndefStatus ndefT5TPollerReadSingleBlock(ndefContext *ctx, uint16_t blockNum, uint8_t *rxBuf, uint16_t rxBufLen, uint16_t *rcvLen); +static ndefStatus ndefT5TPollerReadMultipleBlocks(ndefContext *ctx, uint16_t firstBlockNum, uint8_t numOfBlocks, uint8_t *rxBuf, uint16_t rxBufLen, uint16_t *rcvLen); + +#if !defined NDEF_SKIP_T5T_SYS_INFO +static ndefStatus ndefT5TGetSystemInformation(ndefContext *ctx, bool extended); +#endif /* NDEF_SKIP_T5T_SYS_INFO */ + +#if NDEF_FEATURE_FULL_API +static ndefStatus ndefT5TPollerWriteSingleBlock(ndefContext *ctx, uint16_t blockNum, const uint8_t* wrData); +static ndefStatus ndefT5TPollerLockSingleBlock(ndefContext *ctx, uint16_t blockNum); +#endif /* NDEF_FEATURE_FULL_API */ + +/* + ****************************************************************************** + * GLOBAL FUNCTIONS + ****************************************************************************** + */ + + +/*******************************************************************************/ +bool ndefT5TisSTDevice(const ndefDevice *dev) +{ + if( dev == NULL ) + { + return false; + } + + return (dev->dev.nfcv.InvRes.UID[NDEF_T5T_UID_MANUFACTURER_ID_POS] == NDEF_T5T_MANUFACTURER_ID_ST); +} + + +/*******************************************************************************/ +bool ndefT5TisT5TDevice(const ndefDevice *dev) +{ + if( dev == NULL ) + { + return false; + } + + return dev->type == RFAL_NFC_LISTEN_TYPE_NFCV; +} + + +/*******************************************************************************/ +ndefStatus ndefT5TPollerAccessMode(ndefContext *ctx, const ndefDevice *dev, ndefT5TAccessMode mode) +{ + ndefT5TAccessMode accessMode = mode; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) || + (dev == NULL) ) + { + return ERR_PARAM; + } + + ctx->subCtx.t5t.flags = (uint8_t)RFAL_NFCV_REQ_FLAG_DEFAULT; + + if (accessMode == NDEF_T5T_ACCESS_MODE_SELECTED) + { + if (rfalNfcvPollerSelect(ctx->subCtx.t5t.flags, dev->dev.nfcv.InvRes.UID) == ERR_NONE) + { + /* Selected mode (AMS = 0, SMS = 1) */ + ctx->subCtx.t5t.uid = NULL; + ctx->subCtx.t5t.flags |= (uint8_t)RFAL_NFCV_REQ_FLAG_SELECT; + } + else + { + /* Set Addressed mode if Selected mode failed */ + accessMode = NDEF_T5T_ACCESS_MODE_ADDRESSED; + } + } + if (accessMode == NDEF_T5T_ACCESS_MODE_ADDRESSED) + { + /* Addressed mode (AMS = 1, SMS = 0) */ + ctx->subCtx.t5t.uid = dev->dev.nfcv.InvRes.UID; + ctx->subCtx.t5t.flags |= (uint8_t)RFAL_NFCV_REQ_FLAG_ADDRESS; + } + else if (accessMode == NDEF_T5T_ACCESS_MODE_NON_ADDRESSED) + { + /* Non-addressed mode (AMS = 0, SMS = 0) */ + ctx->subCtx.t5t.uid = NULL; + } + else + { + /* MISRA 15.7 - Empty else */ + } + + return ERR_NONE; +} + + +/*******************************************************************************/ +uint8_t ndefT5TGetBlockLength(ndefContext *ctx) +{ + ndefStatus result; + uint16_t rcvLen; + uint8_t blockLen = 0; + + if ( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) ) + { + return 0; + } + + /* GetBlockLength shall be called only once during context initialization */ + if( ctx->subCtx.t5t.blockLen == 0U ) + { + /* T5T v1.1 4.1.1.3 Retrieve the Block Length */ + ctx->subCtx.t5t.legacySTHighDensity = false; + result = ndefT5TPollerReadSingleBlock(ctx, 0U, ctx->subCtx.t5t.txrxBuf, (uint16_t)sizeof(ctx->subCtx.t5t.txrxBuf), &rcvLen); + if( (result != ERR_NONE) && ctx->subCtx.t5t.stDevice) + { + /* Try High Density Legacy mode */ + ctx->subCtx.t5t.legacySTHighDensity = true; + result = ndefT5TPollerReadSingleBlock(ctx, 0U, ctx->subCtx.t5t.txrxBuf, (uint16_t)sizeof(ctx->subCtx.t5t.txrxBuf), &rcvLen); + if( result != ERR_NONE ) + { + /* High Density Legacy mode not supported */ + ctx->subCtx.t5t.legacySTHighDensity = false; + return 0; + } + } + + if( (rcvLen > 1U) && (ctx->subCtx.t5t.txrxBuf[0U] == (uint8_t)0U) ) + { + blockLen = (uint8_t)(rcvLen - 1U); + } + } + + return blockLen; +} + + +#if !defined NDEF_SKIP_T5T_SYS_INFO +/*******************************************************************************/ +ndefStatus ndefT5TGetMemoryConfig(ndefContext *ctx) +{ + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) ) + { + return ERR_PARAM; + } + + if( !ctx->subCtx.t5t.legacySTHighDensity ) + { + /* Extended Get System Info */ + if( ndefT5TGetSystemInformation(ctx, true) == ERR_NONE ) + { + ctx->subCtx.t5t.sysInfoSupported = true; + } + } + if( !ctx->subCtx.t5t.sysInfoSupported ) + { + /* Get System Info */ + if( ndefT5TGetSystemInformation(ctx, false) == ERR_NONE ) + { + ctx->subCtx.t5t.sysInfoSupported = true; + } + } + + return ERR_NONE; +} + + +/*******************************************************************************/ +static ndefStatus ndefT5TGetSystemInformation(ndefContext *ctx, bool extended) +{ + ReturnCode ret; + uint8_t rxBuf[NDEF_T5T_SYSINFO_MAX_LEN]; + uint16_t rcvLen; + uint8_t* resp; + uint8_t flags; + const uint8_t* uid; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) ) + { + return ERR_PARAM; + } + + uid = ctx->subCtx.t5t.uid; + flags = ctx->subCtx.t5t.flags; + + if( extended ) + { + ret = rfalNfcvPollerExtendedGetSystemInformation(flags, uid, (uint8_t)RFAL_NFCV_SYSINFO_REQ_ALL, rxBuf, (uint16_t)sizeof(rxBuf), &rcvLen); + } + else + { + if( ctx->subCtx.t5t.legacySTHighDensity ) + { + flags |= (uint8_t)RFAL_NFCV_REQ_FLAG_PROTOCOL_EXT; + } + ret = rfalNfcvPollerGetSystemInformation(flags, uid, rxBuf, (uint16_t)sizeof(rxBuf), &rcvLen); + } + + if( ret != RFAL_ERR_NONE ) + { + return ERR_REQUEST; + } + + resp = &rxBuf[0U]; + /* skip Flags */ + resp++; + /* get Info flags */ + ctx->subCtx.t5t.sysInfo.infoFlags = *resp; + resp++; + if( extended && (ndefT5TSysInfoLenValue(ctx->subCtx.t5t.sysInfo.infoFlags) != 0U) ) + { + return ERR_REQUEST; + } + /* get UID */ + (void)ST_MEMCPY(ctx->subCtx.t5t.sysInfo.UID, resp, RFAL_NFCV_UID_LEN); + resp = &resp[RFAL_NFCV_UID_LEN]; + if( ndefT5TSysInfoDFSIDPresent(ctx->subCtx.t5t.sysInfo.infoFlags) != 0U ) + { + ctx->subCtx.t5t.sysInfo.DFSID = *resp; + resp++; + } + if( ndefT5TSysInfoAFIPresent(ctx->subCtx.t5t.sysInfo.infoFlags) != 0U ) + { + ctx->subCtx.t5t.sysInfo.AFI = *resp; + resp++; + } + if( ndefT5TSysInfoMemSizePresent(ctx->subCtx.t5t.sysInfo.infoFlags) != 0U ) + { + if ( ctx->subCtx.t5t.legacySTHighDensity || extended ) + { + /* LRIS64K/M24LR16/M24LR64 */ + ctx->subCtx.t5t.sysInfo.numberOfBlock = *resp; + resp++; + ctx->subCtx.t5t.sysInfo.numberOfBlock |= (((uint16_t)*resp) << 8U); + resp++; + } + else + { + ctx->subCtx.t5t.sysInfo.numberOfBlock = *resp; + resp++; + } + ctx->subCtx.t5t.sysInfo.blockSize = *resp; + resp++; + /* Add 1 to get real values*/ + ctx->subCtx.t5t.sysInfo.numberOfBlock++; + ctx->subCtx.t5t.sysInfo.blockSize++; + } + if( ndefT5TSysInfoICRefPresent(ctx->subCtx.t5t.sysInfo.infoFlags) != 0U ) + { + ctx->subCtx.t5t.sysInfo.ICRef = *resp; + resp++; + } + if( extended && (ndefT5TSysInfoCmdListPresent(ctx->subCtx.t5t.sysInfo.infoFlags) != 0U) ) + { + ctx->subCtx.t5t.sysInfo.supportedCmd[0U] = *resp; + resp++; + ctx->subCtx.t5t.sysInfo.supportedCmd[1U] = *resp; + resp++; + ctx->subCtx.t5t.sysInfo.supportedCmd[2U] = *resp; + resp++; + ctx->subCtx.t5t.sysInfo.supportedCmd[3U] = *resp; + resp++; + } + return ERR_NONE; +} +#endif /* NDEF_SKIP_T5T_SYS_INFO */ + + +/*******************************************************************************/ +bool ndefT5TIsMultipleBlockReadSupported(ndefContext *ctx) +{ + ndefStatus result; + uint16_t rcvdLen; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) ) + { + return false; + } + + /* Autodetect the Multiple Block Read feature (CC Byte 3 b0: MBREAD) */ + result = ndefT5TPollerReadMultipleBlocks(ctx, 0U, 0U, ctx->subCtx.t5t.txrxBuf, (uint16_t)sizeof(ctx->subCtx.t5t.txrxBuf), &rcvdLen); + return (result == ERR_NONE); +} + + +/*******************************************************************************/ +ndefStatus ndefT5TPollerReadBytes(ndefContext *ctx, uint32_t offset, uint32_t len, uint8_t *buf, uint32_t *rcvdLen) +{ + ndefStatus res; + uint8_t lastVal; + uint16_t nbRead; + uint16_t blockLen; + uint16_t startBlock; + uint16_t startAddr; + uint32_t currentLen = len; + uint32_t lvRcvLen = 0U; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) || (buf == NULL) ) + { + return ERR_PARAM; + } + + if ( (ctx->subCtx.t5t.blockLen > 0U) && (len > 0U) ) + { + blockLen = (uint16_t)ctx->subCtx.t5t.blockLen; + + startBlock = (uint16_t) (offset / blockLen); + startAddr = (uint16_t) (startBlock * blockLen); + + res = ( (ctx->cc.t5t.multipleBlockRead == true) && (ctx->subCtx.t5t.useMultipleBlockRead == true) ) ? + /* Read a single block using the ReadMultipleBlock command... */ + ndefT5TPollerReadMultipleBlocks(ctx, startBlock, 0U, ctx->subCtx.t5t.txrxBuf, (uint16_t)sizeof(ctx->subCtx.t5t.txrxBuf), &nbRead) : + ndefT5TPollerReadSingleBlock(ctx, startBlock, ctx->subCtx.t5t.txrxBuf, (uint16_t)sizeof(ctx->subCtx.t5t.txrxBuf), &nbRead); + if (res != ERR_NONE) + { + return res; + } + + nbRead = (uint16_t) (nbRead + startAddr - (uint16_t)offset - 1U); + if ((uint32_t) nbRead > currentLen) + { + nbRead = (uint16_t) currentLen; + } + if (nbRead > 0U) + { + /* Remove the Flag byte */ + (void)ST_MEMCPY(buf, &ctx->subCtx.t5t.txrxBuf[1U - startAddr + (uint16_t)offset], nbRead); + } + lvRcvLen += (uint32_t)nbRead; + currentLen -= (uint32_t)nbRead; + /* Process all blocks but not the last one */ + /* Rationale: ndefT5TPollerReadSingleBlock() reads 2 extra CRC bytes and could write after buffer end */ + while (currentLen > (uint32_t)blockLen) + { + startBlock++; + lastVal = buf[lvRcvLen - 1U]; /* Read previous value that is going to be overwritten by status byte (1st byte in response) */ + + res = ( (ctx->cc.t5t.multipleBlockRead == true) && (ctx->subCtx.t5t.useMultipleBlockRead == true) ) ? + /* Read a single block using the ReadMultipleBlock command... */ + ndefT5TPollerReadMultipleBlocks(ctx, startBlock, 0U, &buf[lvRcvLen - 1U], blockLen + NDEF_T5T_FLAG_LEN + RFAL_CRC_LEN, &nbRead) : + ndefT5TPollerReadSingleBlock(ctx, startBlock, &buf[lvRcvLen - 1U], blockLen + NDEF_T5T_FLAG_LEN + RFAL_CRC_LEN, &nbRead); + if (res != ERR_NONE) + { + return res; + } + + buf[lvRcvLen - 1U] = lastVal; /* Restore previous value */ + + lvRcvLen += blockLen; + currentLen -= blockLen; + } + if (currentLen > 0U) + { + /* Process the last block. Take care of removing status byte and 2 extra CRC bytes that could write after buffer end */ + startBlock++; + + res = ( (ctx->cc.t5t.multipleBlockRead == true) && (ctx->subCtx.t5t.useMultipleBlockRead == true) ) ? + /* Read a single block using the ReadMultipleBlock command... */ + ndefT5TPollerReadMultipleBlocks(ctx, startBlock, 0U, ctx->subCtx.t5t.txrxBuf, (uint16_t)sizeof(ctx->subCtx.t5t.txrxBuf), &nbRead) : + ndefT5TPollerReadSingleBlock(ctx, startBlock, ctx->subCtx.t5t.txrxBuf, (uint16_t)sizeof(ctx->subCtx.t5t.txrxBuf), &nbRead); + if (res != ERR_NONE) + { + return res; + } + + nbRead--; /* Remove Flag byte */ + if (nbRead > currentLen) + { + nbRead = (uint16_t)currentLen; + } + if (nbRead > 0U) + { + (void)ST_MEMCPY(&buf[lvRcvLen], & ctx->subCtx.t5t.txrxBuf[1U], nbRead); + } + lvRcvLen += nbRead; + currentLen -= nbRead; + } + } + if (currentLen != 0U) + { + return ERR_SYSTEM; + } + if( rcvdLen != NULL ) + { + *rcvdLen = lvRcvLen; + } + return ERR_NONE; +} + + +/*******************************************************************************/ +static ndefStatus ndefT5TPollerReadSingleBlock(ndefContext *ctx, uint16_t blockNum, uint8_t *rxBuf, uint16_t rxBufLen, uint16_t *rcvLen) +{ + ReturnCode ret; + uint8_t flags; + const uint8_t* uid; + uint32_t retry; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) || (rxBuf == NULL) || (rcvLen == NULL) ) + { + return ERR_PARAM; + } + + if( ndefT5TIsValidCache(ctx, blockNum) ) + { + /* Retrieve data from cache */ + (void)ST_MEMCPY(rxBuf, ctx->subCtx.t5t.cacheBuf, NDEF_T5T_TxRx_BUFF_HEADER_SIZE + (uint32_t)ctx->subCtx.t5t.blockLen); + *rcvLen = (uint16_t)NDEF_T5T_TxRx_BUFF_HEADER_SIZE + ctx->subCtx.t5t.blockLen; + + return ERR_NONE; + } + + uid = ctx->subCtx.t5t.uid; + flags = ctx->subCtx.t5t.flags; + + retry = NDEF_T5T_N_RETRY_ERROR; + do + { + if( ctx->subCtx.t5t.legacySTHighDensity ) + { +#if RFAL_FEATURE_ST25xV + ret = rfalST25xVPollerM24LRReadSingleBlock(flags, uid, blockNum, rxBuf, rxBufLen, rcvLen); +#else + ret = RFAL_ERR_NOTSUPP; +#endif + } + else + { + if( blockNum < NDEF_T5T_MAX_BLOCK_1_BYTE_ADDR ) + { + ret = rfalNfcvPollerReadSingleBlock(flags, uid, (uint8_t)blockNum, rxBuf, rxBufLen, rcvLen); + } + else + { + ret = rfalNfcvPollerExtendedReadSingleBlock(flags, uid, blockNum, rxBuf, rxBufLen, rcvLen); + } + } + } + while( (retry-- != 0U) && rfalT5TIsTransmissionError(ret) ); + + if( ret == RFAL_ERR_NONE ) + { + /* Update cache */ + if( *rcvLen > 0U ) + { + (void)ST_MEMCPY(ctx->subCtx.t5t.cacheBuf, rxBuf, *rcvLen); + } + ctx->subCtx.t5t.cacheBlock = blockNum; + } + + return (ret == RFAL_ERR_NONE ? ERR_NONE : ERR_REQUEST); +} + + +/*******************************************************************************/ +static ndefStatus ndefT5TPollerReadMultipleBlocks(ndefContext *ctx, uint16_t firstBlockNum, uint8_t numOfBlocks, uint8_t *rxBuf, uint16_t rxBufLen, uint16_t *rcvLen) +{ + ReturnCode ret; + uint8_t flags; + const uint8_t* uid; + uint32_t retry; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) ) + { + return ERR_PARAM; + } + + uid = ctx->subCtx.t5t.uid; + flags = ctx->subCtx.t5t.flags; + + /* 5.5 The number of data blocks returned by the Type 5 Tag in its response is (NB +1) + e.g. NumOfBlocks = 0 means reading 1 block */ + + retry = NDEF_T5T_N_RETRY_ERROR; + do + { + if( ctx->subCtx.t5t.legacySTHighDensity ) + { +#if RFAL_FEATURE_ST25xV + ret = rfalST25xVPollerM24LRReadMultipleBlocks(flags, uid, firstBlockNum, numOfBlocks, rxBuf, rxBufLen, rcvLen); +#else + ret = RFAL_ERR_NOTSUPP; +#endif + } + else + { + if( firstBlockNum < NDEF_T5T_MAX_BLOCK_1_BYTE_ADDR ) + { + ret = rfalNfcvPollerReadMultipleBlocks(flags, uid, (uint8_t)firstBlockNum, numOfBlocks, rxBuf, rxBufLen, rcvLen); + } + else + { + ret = rfalNfcvPollerExtendedReadMultipleBlocks(flags, uid, firstBlockNum, numOfBlocks, rxBuf, rxBufLen, rcvLen); + } + } + } + while( (retry-- != 0U) && rfalT5TIsTransmissionError(ret) ); + + return (ret == RFAL_ERR_NONE ? ERR_NONE : ERR_REQUEST); +} + + +#if NDEF_FEATURE_FULL_API + + +/*******************************************************************************/ +ndefStatus ndefT5TPollerWriteBytes(ndefContext *ctx, uint32_t offset, const uint8_t *buf, uint32_t len, bool pad, bool writeTerminator) +{ + ndefStatus res; + uint16_t nbRead; + uint16_t blockLen; + uint16_t startBlock; + uint16_t startAddr; + const uint8_t* wrbuf = buf; + uint32_t currentLen = len; + bool lvWriteTerminator = writeTerminator; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) || (buf == NULL) || (len == 0U) ) + { + return ERR_PARAM; + } + blockLen = (uint16_t)ctx->subCtx.t5t.blockLen; + if( blockLen == 0U ) + { + return ERR_SYSTEM; + } + startBlock = (uint16_t) (offset / blockLen); + startAddr = (uint16_t) (startBlock * blockLen); + + if (startAddr != offset) + { + /* Unaligned start offset must read the first block before */ + res = ndefT5TPollerReadSingleBlock(ctx, startBlock, ctx->subCtx.t5t.txrxBuf, (uint16_t)sizeof(ctx->subCtx.t5t.txrxBuf), &nbRead); + if( res != ERR_NONE ) + { + return res; + } + if( nbRead != (blockLen + 1U) ) + { + return ERR_PROTO; + } + nbRead = (uint16_t) ((uint32_t)nbRead - 1U + startAddr - offset); + if (nbRead > (uint32_t)currentLen) + { + nbRead = (uint16_t)currentLen; + } + if (nbRead > 0U) + { + (void)ST_MEMCPY(&ctx->subCtx.t5t.txrxBuf[offset - startAddr + 1U], wrbuf, nbRead); + } + if( (offset - startAddr + nbRead) < blockLen ) + { + if( pad ) + { + (void)ST_MEMSET(&ctx->subCtx.t5t.txrxBuf[offset - startAddr + nbRead + 1U], 0x00, blockLen - (offset - startAddr + nbRead)); + } + if (lvWriteTerminator ) + { + ctx->subCtx.t5t.txrxBuf[offset - startAddr + nbRead + 1U] = NDEF_TERMINATOR_TLV_T; + lvWriteTerminator = false; + } + } + res = ndefT5TPollerWriteSingleBlock(ctx, startBlock, &ctx->subCtx.t5t.txrxBuf[1U]); + if (res != ERR_NONE) + { + return res; + } + currentLen -= nbRead; + wrbuf = &wrbuf[nbRead]; + startBlock++; + } + while (currentLen >= blockLen) + { + res = ndefT5TPollerWriteSingleBlock(ctx, startBlock, wrbuf); + if (res != ERR_NONE) + { + return res; + } + currentLen -= blockLen; + wrbuf = &wrbuf[blockLen]; + startBlock++; + } + if ( currentLen != 0U ) + { + if( pad ) + { + (void)ST_MEMSET(ctx->subCtx.t5t.txrxBuf, 0, (uint32_t)blockLen + 1U); + } + else + { + /* Unaligned end, must read the existing block before, except if padding */ + res = ndefT5TPollerReadSingleBlock(ctx, startBlock, ctx->subCtx.t5t.txrxBuf, (uint16_t)sizeof(ctx->subCtx.t5t.txrxBuf), &nbRead); + if( res != ERR_NONE ) + { + return res; + } + if( nbRead != (blockLen + 1U) ) + { + return ERR_PROTO; + } + } + /* currentLen > 0U */ + (void)ST_MEMCPY(&ctx->subCtx.t5t.txrxBuf[1U], wrbuf, currentLen); + if( lvWriteTerminator ) + { + ctx->subCtx.t5t.txrxBuf[1U + currentLen] = NDEF_TERMINATOR_TLV_T; + lvWriteTerminator = false; + } + res = ndefT5TPollerWriteSingleBlock(ctx, startBlock, &ctx->subCtx.t5t.txrxBuf[1U]); + if (res != ERR_NONE) + { + return res; + } + } + if( lvWriteTerminator ) + { + (void)ST_MEMSET(ctx->subCtx.t5t.txrxBuf, 0, (uint32_t)blockLen + 1U); + ctx->subCtx.t5t.txrxBuf[1U] = NDEF_TERMINATOR_TLV_T; + (void)ndefT5TPollerWriteSingleBlock(ctx, startBlock, &ctx->subCtx.t5t.txrxBuf[1U]); + } + return ERR_NONE; +} + + +/*******************************************************************************/ +ndefStatus ndefT5TIsDevicePresent(ndefContext *ctx) +{ + ndefStatus ret; + uint16_t blockAddr; + uint16_t rcvLen; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) ) + { + return ERR_PARAM; + } + + ndefT5TInvalidateCache(ctx); + + blockAddr = 0U; + + ret = ndefT5TPollerReadSingleBlock(ctx, blockAddr, ctx->subCtx.t5t.txrxBuf, (uint16_t)sizeof(ctx->subCtx.t5t.txrxBuf), &rcvLen); + + return ret; +} + + +/*******************************************************************************/ +static ndefStatus ndefT5TPollerWriteSingleBlock(ndefContext *ctx, uint16_t blockNum, const uint8_t* wrData) +{ + ReturnCode ret; + uint8_t flags; + const uint8_t* uid; + uint32_t retry; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) ) + { + return ERR_PARAM; + } + + uid = ctx->subCtx.t5t.uid; + flags = ctx->subCtx.t5t.flags; + if (ctx->cc.t5t.specialFrame) + { + flags |= (uint8_t)RFAL_NFCV_REQ_FLAG_OPTION; + } + + ndefT5TInvalidateCache(ctx); + + retry = NDEF_T5T_N_RETRY_ERROR; + do + { + if( ctx->subCtx.t5t.legacySTHighDensity ) + { +#if RFAL_FEATURE_ST25xV + ret = rfalST25xVPollerM24LRWriteSingleBlock(flags, uid, blockNum, wrData, ctx->subCtx.t5t.blockLen); +#else + ret = ERR_NOTSUPP; +#endif + } + else + { + if( blockNum < NDEF_T5T_MAX_BLOCK_1_BYTE_ADDR ) + { + ret = rfalNfcvPollerWriteSingleBlock(flags, uid, (uint8_t)blockNum, wrData, ctx->subCtx.t5t.blockLen); + } + else + { + ret = rfalNfcvPollerExtendedWriteSingleBlock(flags, uid, blockNum, wrData, ctx->subCtx.t5t.blockLen); + } + } + } + while( (retry-- != 0U) && rfalT5TIsTransmissionError(ret) ); + + return (ret == RFAL_ERR_NONE ? ERR_NONE : ERR_REQUEST); +} + + +/*******************************************************************************/ +static ndefStatus ndefT5TPollerLockSingleBlock(ndefContext *ctx, uint16_t blockNum) +{ + ReturnCode ret; + uint8_t flags; + const uint8_t* uid; + uint32_t retry; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) ) + { + return ERR_PARAM; + } + + uid = ctx->subCtx.t5t.uid; + flags = ctx->subCtx.t5t.flags; + if (ctx->cc.t5t.specialFrame) + { + flags |= (uint8_t)RFAL_NFCV_REQ_FLAG_OPTION; + } + + retry = NDEF_T5T_N_RETRY_ERROR; + do + { + if( blockNum < NDEF_T5T_MAX_BLOCK_1_BYTE_ADDR ) + { + ret = rfalNfcvPollerLockBlock(flags, uid, (uint8_t)blockNum); + } + else + { + ret = rfalNfcvPollerExtendedLockSingleBlock(flags, uid, blockNum); + } + } + while( (retry-- != 0U) && rfalT5TIsTransmissionError(ret) ); + + return (ret == RFAL_ERR_NONE ? ERR_NONE : ERR_REQUEST); +} + + +/*******************************************************************************/ +ndefStatus ndefT5TLockDevice(ndefContext *ctx) +{ + ndefStatus ret; + uint32_t numBlocks; + uint16_t i; + + if( (ctx == NULL) || (ctx->type != NDEF_DEV_T5T) ) + { + return ERR_PARAM; + } + + ctx->state = NDEF_STATE_READONLY; + numBlocks = (ctx->areaLen + (uint32_t)ctx->cc.t5t.ccLen)/(uint32_t)ctx->subCtx.t5t.blockLen; + if( ctx->cc.t5t.lockBlock && !ctx->subCtx.t5t.legacySTHighDensity ) + { + for( i = 0; i < numBlocks; i++ ) + { + ret = ndefT5TPollerLockSingleBlock(ctx, i); + if( ret != ERR_NONE ) + { + return ret; + } + } + } + + return ERR_NONE; +} + +#endif /* NDEF_FEATURE_FULL_API */ + +#endif /* NDEF_FEATURE_T5T */ diff --git a/components/spi-st25r3911b/en.STSW-ST25RFAL001/include/rfal_nfc.h b/components/spi-st25r3911b/en.STSW-ST25RFAL001/include/rfal_nfc.h index 31dd959..fc3fb34 100644 --- a/components/spi-st25r3911b/en.STSW-ST25RFAL001/include/rfal_nfc.h +++ b/components/spi-st25r3911b/en.STSW-ST25RFAL001/include/rfal_nfc.h @@ -272,6 +272,55 @@ typedef union{ /* PRQA S 0750 # MISRA 19.2 - Members of the union will not be rfalNfcDepPduBufFormat nfcDepBuf; /*!< NFC-DEP buffer format (with header/prologue) */ }rfalNfcBuffer; + + +#define RFAL_NFC_MAX_DEVICES 5U /*!< Max number of devices supported */ +#define RFAL_NFC_T_FIELD_OFF 5U /*!< tFIELD_OFF minimal duration Activity 2.2 Table 26 */ + +/*! Buffer union, only one interface is used at a time */ +typedef union{ /*PRQA S 0750 # MISRA 19.2 - Members of the union will not be used concurrently, only one interface at a time */ + rfalIsoDepBufFormat isoDepBuf; /*!< ISO-DEP buffer format (with header/prologue) */ + rfalNfcDepBufFormat nfcDepBuf; /*!< NFC-DEP buffer format (with header/prologue) */ +}rfalNfcTmpBuffer; + + +/*! RFAL NFC instance */ + +typedef struct{ + rfalNfcState state; /*!< Main state */ + uint16_t techsFound; /*!< Technologies found bitmask */ + uint16_t techs2do; /*!< Technologies still to be performed */ + uint16_t techDctCnt; /*!< Technologies detection counter (before WU) */ + rfalBitRate ap2pBR; /*!< Bit rate to poll for AP2P */ + uint8_t selDevIdx; /*!< Selected device index */ + rfalNfcDevice *activeDev; /*!< Active device pointer */ + rfalNfcDiscoverParam disc; /*!< Discovery parameters */ + rfalNfcDevice devList[RFAL_NFC_MAX_DEVICES]; /*!< Location of device list */ + uint8_t devCnt; /*!< Decices found counter */ + uint32_t discTmr; /*!< Discovery Total duration timer */ + ReturnCode dataExErr; /*!< Last Data Exchange error */ + rfalNfcDeactivateType deactType; /*!< Deactivation type */ + bool isRxChaining; /*!< Flag indicating Other device is chaining */ + uint32_t lmMask; /*!< Listen Mode mask */ + bool isFieldOn; /*!< Flag indicating Fieldon for Passive Poll */ + bool isTechInit; /*!< Flag indicating technology has been set */ + bool isOperOngoing; /*!< Flag indicating operation is ongoing */ + bool isDeactivating; /*!< Flag indicating deactivation is ongoing */ + + rfalNfcaSensRes sensRes; /*!< SENS_RES during card detection and activation */ + rfalNfcbSensbRes sensbRes; /*!< SENSB_RES during card detection and activation */ + uint8_t sensbResLen; /*!< SENSB_RES length */ + + rfalNfcBuffer txBuf; /*!< Tx buffer for Data Exchange */ + rfalNfcBuffer rxBuf; /*!< Rx buffer for Data Exchange */ + uint16_t rxLen; /*!< Length of received data on Data Exchange */ + +#if RFAL_FEATURE_NFC_DEP || RFAL_FEATURE_ISO_DEP + rfalNfcTmpBuffer tmpBuf; /*!< Tmp buffer for Data Exchange */ +#endif /* RFAL_FEATURE_NFC_DEP || RFAL_FEATURE_ISO_DEP */ + +}rfalNfc; + /*******************************************************************************/ /* @@ -336,6 +385,7 @@ ReturnCode rfalNfcDiscover( const rfalNfcDiscoverParam *disParams ); ***************************************************************************** */ rfalNfcState rfalNfcGetState( void ); +rfalNfc* rfalNfcGetDev( void ); /*! diff --git a/components/spi-st25r3911b/en.STSW-ST25RFAL001/rfal_platform.h b/components/spi-st25r3911b/en.STSW-ST25RFAL001/rfal_platform.h index e549013..8dde088 100644 --- a/components/spi-st25r3911b/en.STSW-ST25RFAL001/rfal_platform.h +++ b/components/spi-st25r3911b/en.STSW-ST25RFAL001/rfal_platform.h @@ -14,7 +14,7 @@ ////#define ST25R_SS_PIN SPI1_CS_Pin /*!< GPIO pin used for ST25R SPI SS */ ////#define ST25R_SS_PORT SPI1_CS_GPIO_Port /*!< GPIO port used for ST25R SPI SS port */ //// -#define ST25R_INT_PIN -1 /*!< GPIO pin used for ST25R External Interrupt */ +#define ST25R_INT_PIN 34 /*!< GPIO pin used for ST25R External Interrupt */ ////#define ST25R_INT_PORT ST25R_IRQ_GPIO_Port /*!< GPIO port used for ST25R External Interrupt */ //// ////#ifdef LED_FIELD_Pin @@ -50,9 +50,9 @@ //#define platformProtectWorker() /* Protect RFAL Worker/Task/Process from concurrent execution on multi thread platforms */ //#define platformUnprotectWorker() /* Unprotect RFAL Worker/Task/Process from concurrent execution on multi thread platforms */ // -//#define platformIrqST25RSetCallback( cb ) -//#define platformIrqST25RPinInitialize() -// +#define platformIrqST25RSetCallback( cb ) global_st25r3911b->irq_callback = cb +#define platformIrqST25RPinInitialize() + //#define platformIrqST25RSetCallback( cb ) //#define platformIrqST25RPinInitialize() // @@ -70,11 +70,10 @@ #define platformGpioIsLow( port, pin ) (!platformGpioIsHigh(port, pin)) /*!< Checks if the given LED is Low */ // -#define MAX(a, b) ((a > b) ? a : b) -#define platformTimerCreate( t ) xTaskGetTickCount() + (MAX(t, 10) / portTICK_PERIOD_MS)/*!< Create a timer with the given time (ms) */ -#define platformTimerIsExpired( timer ) (xTaskGetTickCount() > timer) /*!< Checks if the given timer is expired */ -#define platformTimerDestroy( timer ) /*!< Stop and release the given timer */ -#define platformDelay( t ) vTaskDelay( t / portTICK_PERIOD_MS ) /*!< Performs a delay for the given time (ms) */ +#define platformTimerCreate( t ) (xTaskGetTickCount() + pdMS_TO_TICKS(t)) /*!< Create a timer with the given time (ms) */ +#define platformTimerIsExpired( timer ) (xTaskGetTickCount() > timer) /*!< Checks if the given timer is expired */ +#define platformTimerDestroy( timer ) /*!< Stop and release the given timer */ +#define platformDelay( t ) vTaskDelay( pdMS_TO_TICKS(t) ) /*!< Performs a delay for the given time (ms) */ #define platformGetSysTick() /*!< Get System Tick ( 1 tick = 1 ms) */ @@ -82,7 +81,7 @@ // #define platformSpiSelect() gpio_set_level(global_st25r3911b->pin_cs, false) /*!< SPI SS\CS: Chip|Slave Select */ #define platformSpiDeselect() gpio_set_level(global_st25r3911b->pin_cs, true) /*!< SPI SS\CS: Chip|Slave Deselect */ -#define platformSpiTxRx( txBuf, rxBuf, len ) rfid_rxtx(global_st25r3911b, txBuf, rxBuf, len) /*!< SPI transceive */ +#define platformSpiTxRx( txBuf, rxBuf, len ) st25r3911b_rxtx(global_st25r3911b, txBuf, rxBuf, len) /*!< SPI transceive */ // //#define platformLog(...) ESP_LOGI("nfc", __VA_ARGS__) /*!< Log method */ @@ -93,14 +92,14 @@ #define RFAL_FEATURE_WAKEUP_MODE true /*!< Enable/Disable RFAL support for the Wake-Up mode */ #define RFAL_FEATURE_LOWPOWER_MODE false /*!< Enable/Disable RFAL support for the Low Power mode */ #define RFAL_FEATURE_NFCA true /*!< Enable/Disable RFAL support for NFC-A (ISO14443A) */ -#define RFAL_FEATURE_NFCB true /*!< Enable/Disable RFAL support for NFC-B (ISO14443B) */ -#define RFAL_FEATURE_NFCF true /*!< Enable/Disable RFAL support for NFC-F (FeliCa) */ -#define RFAL_FEATURE_NFCV true /*!< Enable/Disable RFAL support for NFC-V (ISO15693) */ -#define RFAL_FEATURE_T1T true /*!< Enable/Disable RFAL support for T1T (Topaz) */ -#define RFAL_FEATURE_T2T true /*!< Enable/Disable RFAL support for T2T */ -#define RFAL_FEATURE_T4T true /*!< Enable/Disable RFAL support for T4T */ -#define RFAL_FEATURE_ST25TB true /*!< Enable/Disable RFAL support for ST25TB */ -#define RFAL_FEATURE_ST25xV true /*!< Enable/Disable RFAL support for ST25TV/ST25DV */ +#define RFAL_FEATURE_NFCB false /*!< Enable/Disable RFAL support for NFC-B (ISO14443B) */ +#define RFAL_FEATURE_NFCF false /*!< Enable/Disable RFAL support for NFC-F (FeliCa) */ +#define RFAL_FEATURE_NFCV false /*!< Enable/Disable RFAL support for NFC-V (ISO15693) */ +#define RFAL_FEATURE_T1T false /*!< Enable/Disable RFAL support for T1T (Topaz) */ +#define RFAL_FEATURE_T2T false /*!< Enable/Disable RFAL support for T2T */ +#define RFAL_FEATURE_T4T false /*!< Enable/Disable RFAL support for T4T */ +#define RFAL_FEATURE_ST25TB false /*!< Enable/Disable RFAL support for ST25TB */ +#define RFAL_FEATURE_ST25xV false /*!< Enable/Disable RFAL support for ST25TV/ST25DV */ #define RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG false /*!< Enable/Disable Analog Configs to be dynamically updated (RAM) */ #define RFAL_FEATURE_DPO false /*!< Enable/Disable RFAL Dynamic Power Output support */ #define RFAL_FEATURE_ISO_DEP true /*!< Enable/Disable RFAL support for ISO-DEP (ISO14443-4) */ diff --git a/components/spi-st25r3911b/en.STSW-ST25RFAL001/source/rfal_nfc.c b/components/spi-st25r3911b/en.STSW-ST25RFAL001/source/rfal_nfc.c index fe4338c..4187efe 100644 --- a/components/spi-st25r3911b/en.STSW-ST25RFAL001/source/rfal_nfc.c +++ b/components/spi-st25r3911b/en.STSW-ST25RFAL001/source/rfal_nfc.c @@ -45,9 +45,6 @@ * GLOBAL DEFINES ****************************************************************************** */ -#define RFAL_NFC_MAX_DEVICES 5U /*!< Max number of devices supported */ -#define RFAL_NFC_T_FIELD_OFF 5U /*!< tFIELD_OFF minimal duration Activity 2.2 Table 26 */ - /* ****************************************************************************** @@ -73,48 +70,7 @@ ****************************************************************************** */ -/*! Buffer union, only one interface is used at a time */ -typedef union{ /*PRQA S 0750 # MISRA 19.2 - Members of the union will not be used concurrently, only one interface at a time */ - rfalIsoDepBufFormat isoDepBuf; /*!< ISO-DEP buffer format (with header/prologue) */ - rfalNfcDepBufFormat nfcDepBuf; /*!< NFC-DEP buffer format (with header/prologue) */ -}rfalNfcTmpBuffer; - - -/*! RFAL NFC instance */ -typedef struct{ - rfalNfcState state; /*!< Main state */ - uint16_t techsFound; /*!< Technologies found bitmask */ - uint16_t techs2do; /*!< Technologies still to be performed */ - uint16_t techDctCnt; /*!< Technologies detection counter (before WU) */ - rfalBitRate ap2pBR; /*!< Bit rate to poll for AP2P */ - uint8_t selDevIdx; /*!< Selected device index */ - rfalNfcDevice *activeDev; /*!< Active device pointer */ - rfalNfcDiscoverParam disc; /*!< Discovery parameters */ - rfalNfcDevice devList[RFAL_NFC_MAX_DEVICES]; /*!< Location of device list */ - uint8_t devCnt; /*!< Decices found counter */ - uint32_t discTmr; /*!< Discovery Total duration timer */ - ReturnCode dataExErr; /*!< Last Data Exchange error */ - rfalNfcDeactivateType deactType; /*!< Deactivation type */ - bool isRxChaining; /*!< Flag indicating Other device is chaining */ - uint32_t lmMask; /*!< Listen Mode mask */ - bool isFieldOn; /*!< Flag indicating Fieldon for Passive Poll */ - bool isTechInit; /*!< Flag indicating technology has been set */ - bool isOperOngoing; /*!< Flag indicating operation is ongoing */ - bool isDeactivating; /*!< Flag indicating deactivation is ongoing */ - - rfalNfcaSensRes sensRes; /*!< SENS_RES during card detection and activation */ - rfalNfcbSensbRes sensbRes; /*!< SENSB_RES during card detection and activation */ - uint8_t sensbResLen; /*!< SENSB_RES length */ - - rfalNfcBuffer txBuf; /*!< Tx buffer for Data Exchange */ - rfalNfcBuffer rxBuf; /*!< Rx buffer for Data Exchange */ - uint16_t rxLen; /*!< Length of received data on Data Exchange */ - -#if RFAL_FEATURE_NFC_DEP || RFAL_FEATURE_ISO_DEP - rfalNfcTmpBuffer tmpBuf; /*!< Tmp buffer for Data Exchange */ -#endif /* RFAL_FEATURE_NFC_DEP || RFAL_FEATURE_ISO_DEP */ - -}rfalNfc; + /* @@ -303,6 +259,12 @@ ReturnCode rfalNfcSelect( uint8_t devIdx ) return RFAL_ERR_NONE; } +/*******************************************************************************/ +rfalNfc* rfalNfcGetDev( void ) +{ + return &gNfcDev; +} + /*******************************************************************************/ rfalNfcState rfalNfcGetState( void ) { diff --git a/components/spi-st25r3911b/include/st25r3911b.h b/components/spi-st25r3911b/include/st25r3911b.h index dd515a1..731ffc6 100644 --- a/components/spi-st25r3911b/include/st25r3911b.h +++ b/components/spi-st25r3911b/include/st25r3911b.h @@ -9,7 +9,7 @@ #include #define ST25R3911 -//#define ST25R_SELFTEST +#define ST25R_SELFTEST #include "rfal_defConfig.h" #include "rfal_platform.h" @@ -23,7 +23,13 @@ typedef struct ST25R3911B { spi_device_handle_t spi_device; SemaphoreHandle_t mutex; SemaphoreHandle_t spi_semaphore; + TaskHandle_t intr_task_handle; + SemaphoreHandle_t intr_trigger; + void (*irq_callback)(void); } ST25R3911B; esp_err_t st25r3911b_init(ST25R3911B * device); -esp_err_t rfid_rxtx(ST25R3911B *device, const uint8_t* tx, const uint8_t* rx, uint8_t length); +esp_err_t st25r3911b_chip_id(uint8_t *id); +esp_err_t st25r3911b_discover(rfalNfcDevice *nfcDevice, uint32_t timeout_ms); + +esp_err_t st25r3911b_rxtx(ST25R3911B *device, const uint8_t* tx, const uint8_t* rx, uint8_t length); diff --git a/components/spi-st25r3911b/st25r3911b.c b/components/spi-st25r3911b/st25r3911b.c index 0bcff5a..771c3bf 100644 --- a/components/spi-st25r3911b/st25r3911b.c +++ b/components/spi-st25r3911b/st25r3911b.c @@ -29,57 +29,38 @@ static const char *TAG = "st25r3911b"; static uint8_t NFCID3[] = {0x01, 0xFE, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}; static uint8_t GB[] = {0x46, 0x66, 0x6d, 0x01, 0x01, 0x11, 0x02, 0x02, 0x07, 0x80, 0x03, 0x02, 0x00, 0x03, 0x04, 0x01, 0x32, 0x07, 0x01, 0x03}; +#define NFC_LOG_SPI 0 + +#define MAX_HEX_STR_LENGTH 64 +char hexStr[MAX_HEX_STR_LENGTH * 2]; + +static char* hex2Str(unsigned char * data, size_t dataLen) { + unsigned char *pin = data; + const char *hex = "0123456789ABCDEF"; + char *pout = hexStr; + uint8_t i = 0; + if(dataLen == 0) { + hexStr[0] = 0; + } else { + for(; i < dataLen - 1 && i < MAX_HEX_STR_LENGTH - 1; ++i) { + *pout++ = hex[(*pin>>4)&0xF]; + *pout++ = hex[(*pin++)&0xF]; + } + *pout++ = hex[(*pin>>4)&0xF]; + *pout++ = hex[(*pin)&0xF]; + *pout = 0; + } -esp_err_t rfid_reg_read(ST25R3911B *device, uint8_t reg, uint8_t *value) { - if (device->spi_device == NULL) return ESP_FAIL; - if (reg > 0x3f) return ESP_ERR_INVALID_ARG; - - platformProtectST25RComm(); - platformSpiSelect(); - - uint8_t tx[2]; - uint8_t rx[2]; - tx[0] = 0x40 | reg; - tx[1] = 0; - rx[0] = 0xff; - rx[1] = 0xff; - - esp_err_t res = platformSpiTxRx( tx, rx, 2 ); - - platformSpiDeselect(); - platformUnprotectST25RComm(); - - *value = rx[1]; - return res; -} - -/* TODO: Combine with read ?, only 1 byte different*/ -esp_err_t rfid_reg_write(ST25R3911B *device, uint8_t reg, uint8_t value) { - if (device->spi_device == NULL) return ESP_FAIL; - if (reg > 0x3f) return ESP_ERR_INVALID_ARG; - - uint8_t tx[2]; - tx[0] = 0x00 | reg; - tx[1] = value; - spi_transaction_t transaction = { - .length = 16, // transaction length is in bits - .tx_buffer = &tx, - .user = (void *) device, - }; - - if (device->spi_semaphore != NULL) xSemaphoreTake(device->spi_semaphore, portMAX_DELAY); - esp_err_t res = spi_device_transmit(device->spi_device, &transaction); - if (device->spi_semaphore != NULL) xSemaphoreGive(device->spi_semaphore); - return res; + return hexStr; } -esp_err_t rfid_rxtx(ST25R3911B *device, const uint8_t* tx, const uint8_t* rx, uint8_t length) { +esp_err_t st25r3911b_rxtx(ST25R3911B *device, const uint8_t* tx, const uint8_t* rx, uint8_t length) { if (device->spi_device == NULL) return ESP_FAIL; -// ESP_LOGI(TAG, "rfid_rxtx, tx = %d, rx = %d, length = %d", tx != NULL, rx != NULL, length); esp_err_t res = ESP_OK; size_t len = length * 8; +#if NFC_LOG_SPI == 1 if (tx != NULL) { if ((tx[0] & 0xC0) == 0xC0) { ESP_LOGI(TAG, "Command %x %d", tx[0], length); @@ -91,6 +72,7 @@ esp_err_t rfid_rxtx(ST25R3911B *device, const uint8_t* tx, const uint8_t* rx, ui ESP_LOGI(TAG, "FIFO W %d, %x %x %x %x" , length, tx[0], tx[1], tx[2], tx[3]); } } +#endif spi_transaction_t tx_transaction = { @@ -99,202 +81,192 @@ esp_err_t rfid_rxtx(ST25R3911B *device, const uint8_t* tx, const uint8_t* rx, ui .tx_buffer = (void*) tx, .rx_buffer = (void*) rx, .user = (void *) device, + .flags = 0, }; res = spi_device_transmit(device->spi_device, &tx_transaction); if (res != ESP_OK) { - ESP_LOGE(TAG, "rfix_rxtx failed with %d", res); + ESP_LOGE(TAG, "rxtx failed with %d", res); return res; } +#if NFC_LOG_SPI == 1 if (tx != NULL && rx != NULL) { if (tx[0] == 0xBF) { ESP_LOGI(TAG, "FIFO R %d, %x %x %x %x" , length, rx[0], rx[1], rx[2], rx[3]); } } +#endif return res; } -/* TODO: Combine with read ?, only 1 byte different*/ -esp_err_t rfid_send_command(ST25R3911B *device, uint8_t command) { - if (device->spi_device == NULL) return ESP_FAIL; - - /* Dont check. ST include the flags in the value */ - // if (command > 0x3f) return ESP_ERR_INVALID_ARG; - - uint8_t data = 0xC0 | command; - - spi_transaction_t transaction = { - .length = 8, // transaction length is in bits - .tx_buffer = &data, - .user = (void *) device, - }; - if (device->spi_semaphore != NULL) xSemaphoreTake(device->spi_semaphore, portMAX_DELAY); - esp_err_t res = spi_device_transmit(device->spi_device, &transaction); - if (device->spi_semaphore != NULL) xSemaphoreGive(device->spi_semaphore); - return res; -} - -esp_err_t st25r_test() { - ReturnCode err; - - - rtc_wdt_disable(); - - err = st25r3911Initialize(); - if( err != RFAL_ERR_NONE ) { - ESP_LOGE(TAG, "failed to st25r3911Initialize: %d", err); - return ESP_FAIL; - } - - - err = rfalNfcInitialize(); - if( err != RFAL_ERR_NONE ) { - ESP_LOGE(TAG, "failed to initialize"); - return ESP_FAIL; - } - /* This is the same sequence as st25r3911Initialize() in en.STSW-ST25RFAL001/source/st25r3911/st25r3911.c*/ -// rfid_send_command(device, ST25R3911_CMD_SET_DEFAULT); /* 0xc1*/ -// rfid_reg_write(device, ST25R3911_REG_OP_CONTROL, 0); /* 0x02 0x00*/ -// rfid_reg_write(device, ST25R3911_REG_IO_CONF1, ST25R3911_REG_IO_CONF1_osc); /* 0x00 0x08*/ -// rfid_reg_write(device, ST25R3911_REG_IO_CONF2, 0); /* 0x01 0x00*/ -// -// uint8_t rmr = 0; -// rfid_reg_read(device, ST25R3911_REG_IO_CONF2, &rmr); /* 0x41 0xNN */ -// rfid_reg_write(device, ST25R3911_REG_IO_CONF2, rmr | ST25R3911_REG_IO_CONF2_miso_pd1 | ST25R3911_REG_IO_CONF2_miso_pd2); /* 0x01 0x18*/ - - uint8_t id = 0; - if( !st25r3911CheckChipID( &id ) ) { - ESP_LOGE(TAG, "failed to read chip ID"); - return RFAL_ERR_HW_MISMATCH; - } - - switch (id & ST25R3911_REG_IC_IDENTITY_mask_ic_rev) { - case 0x02: - ESP_LOGI(TAG, "silicon rev. r3.1"); - break; - case 0x03: - ESP_LOGI(TAG, "silicon rev. r3.3"); - break; - case 0x04: - ESP_LOGI(TAG, "silicon rev. r4.0"); - break; - case 0x05: - ESP_LOGI(TAG, "silicon rev. r4.1"); - break; - default: - ESP_LOGE(TAG, "Currently unknown silicon rev. %x", id & ST25R3911_REG_IC_IDENTITY_mask_ic_rev); - return ESP_FAIL; +bool st25r3911b_get_discovery_prams(rfalNfcDiscoverParam * discParam) { + if (discParam == NULL) { + return false; } - static rfalNfcDevice *nfcDevice; - - static rfalNfcDiscoverParam discParam; - rfalNfcDefaultDiscParams( &discParam ); + rfalNfcDefaultDiscParams( discParam ); - discParam.devLimit = 1U; + discParam->devLimit = 1U; - memcpy( &discParam.nfcid3, NFCID3, sizeof(NFCID3) ); - memcpy( &discParam.GB, GB, sizeof(GB) ); - discParam.GBLen = sizeof(GB); - discParam.p2pNfcaPrio = true; + memcpy( discParam->nfcid3, NFCID3, sizeof(NFCID3) ); + memcpy( discParam->GB, GB, sizeof(GB) ); + discParam->GBLen = sizeof(GB); + discParam->p2pNfcaPrio = true; - discParam.notifyCb = NULL; - discParam.totalDuration = 1000U; - discParam.techs2Find = RFAL_NFC_TECH_NONE; /* For the demo, enable the NFC Technologies based on RFAL Feature switches */ + discParam->notifyCb = NULL; + discParam->totalDuration = 1000U; + discParam->techs2Find = RFAL_NFC_TECH_NONE; /* For the demo, enable the NFC Technologies based on RFAL Feature switches */ #if RFAL_FEATURE_NFCA - discParam.techs2Find |= RFAL_NFC_POLL_TECH_A; + discParam->techs2Find |= RFAL_NFC_POLL_TECH_A; #endif /* RFAL_FEATURE_NFCA */ #if RFAL_FEATURE_NFCB - discParam.techs2Find |= RFAL_NFC_POLL_TECH_B; + discParam->techs2Find |= RFAL_NFC_POLL_TECH_B; #endif /* RFAL_FEATURE_NFCB */ #if RFAL_FEATURE_NFCF - discParam.techs2Find |= RFAL_NFC_POLL_TECH_F; + discParam->techs2Find |= RFAL_NFC_POLL_TECH_F; #endif /* RFAL_FEATURE_NFCF */ #if RFAL_FEATURE_NFCV - discParam.techs2Find |= RFAL_NFC_POLL_TECH_V; + discParam->techs2Find |= RFAL_NFC_POLL_TECH_V; #endif /* RFAL_FEATURE_NFCV */ #if RFAL_FEATURE_ST25TB - discParam.techs2Find |= RFAL_NFC_POLL_TECH_ST25TB; + discParam->techs2Find |= RFAL_NFC_POLL_TECH_ST25TB; #endif /* RFAL_FEATURE_ST25TB */ #if RFAL_SUPPORT_MODE_POLL_ACTIVE_P2P && RFAL_FEATURE_NFC_DEP - discParam.techs2Find |= RFAL_NFC_POLL_TECH_AP2P; + discParam->techs2Find |= RFAL_NFC_POLL_TECH_AP2P; #endif /* RFAL_SUPPORT_MODE_POLL_ACTIVE_P2P && RFAL_FEATURE_NFC_DEP */ #if RFAL_SUPPORT_MODE_LISTEN_ACTIVE_P2P && RFAL_FEATURE_NFC_DEP && RFAL_FEATURE_LISTEN_MODE - discParam.techs2Find |= RFAL_NFC_LISTEN_TECH_AP2P; + discParam->techs2Find |= RFAL_NFC_LISTEN_TECH_AP2P; #endif /* RFAL_SUPPORT_MODE_LISTEN_ACTIVE_P2P && RFAL_FEATURE_NFC_DEP && RFAL_FEATURE_LISTEN_MODE */ #if RFAL_SUPPORT_CE && RFAL_FEATURE_LISTEN_MODE #if RFAL_SUPPORT_MODE_LISTEN_NFCA /* Set configuration for NFC-A CE */ - ST_MEMCPY( discParam.lmConfigPA.SENS_RES, ceNFCA_SENS_RES, RFAL_LM_SENS_RES_LEN ); /* Set SENS_RES / ATQA */ - ST_MEMCPY( discParam.lmConfigPA.nfcid, ceNFCA_NFCID, RFAL_LM_NFCID_LEN_04 ); /* Set NFCID / UID */ - discParam.lmConfigPA.nfcidLen = RFAL_LM_NFCID_LEN_04; /* Set NFCID length to 7 bytes */ - discParam.lmConfigPA.SEL_RES = ceNFCA_SEL_RES; /* Set SEL_RES / SAK */ + ST_MEMCPY( discParam->lmConfigPA.SENS_RES, ceNFCA_SENS_RES, RFAL_LM_SENS_RES_LEN ); /* Set SENS_RES / ATQA */ + ST_MEMCPY( discParam->lmConfigPA.nfcid, ceNFCA_NFCID, RFAL_LM_NFCID_LEN_04 ); /* Set NFCID / UID */ + discParam->lmConfigPA.nfcidLen = RFAL_LM_NFCID_LEN_04; /* Set NFCID length to 7 bytes */ + discParam->lmConfigPA.SEL_RES = ceNFCA_SEL_RES; /* Set SEL_RES / SAK */ - discParam.techs2Find |= RFAL_NFC_LISTEN_TECH_A; + discParam->techs2Find |= RFAL_NFC_LISTEN_TECH_A; #endif /* RFAL_SUPPORT_MODE_LISTEN_NFCA */ #if RFAL_SUPPORT_MODE_LISTEN_NFCF /* Set configuration for NFC-F CE */ - ST_MEMCPY( discParam.lmConfigPF.SC, ceNFCF_SC, RFAL_LM_SENSF_SC_LEN ); /* Set System Code */ + ST_MEMCPY( discParam->lmConfigPF.SC, ceNFCF_SC, RFAL_LM_SENSF_SC_LEN ); /* Set System Code */ ST_MEMCPY( &ceNFCF_SENSF_RES[RFAL_NFCF_CMD_LEN], ceNFCF_nfcid2, RFAL_NFCID2_LEN ); /* Load NFCID2 on SENSF_RES */ - ST_MEMCPY( discParam.lmConfigPF.SENSF_RES, ceNFCF_SENSF_RES, RFAL_LM_SENSF_RES_LEN ); /* Set SENSF_RES / Poll Response */ + ST_MEMCPY( discParam->lmConfigPF.SENSF_RES, ceNFCF_SENSF_RES, RFAL_LM_SENSF_RES_LEN ); /* Set SENSF_RES / Poll Response */ - discParam.techs2Find |= RFAL_NFC_LISTEN_TECH_F; + discParam->techs2Find |= RFAL_NFC_LISTEN_TECH_F; #endif /* RFAL_SUPPORT_MODE_LISTEN_NFCF */ #endif /* RFAL_SUPPORT_CE && RFAL_FEATURE_LISTEN_MODE */ + return true; +} - ESP_LOGI(TAG, "state %d", rfalNfcGetState()); +esp_err_t st25r3911b_discover(rfalNfcDevice *nfcDevice, uint32_t timeout_ms) { + rfalNfcDiscoverParam discParam; + st25r3911b_get_discovery_prams(&discParam); - err = rfalNfcDiscover( &discParam ); + ReturnCode err = rfalNfcDiscover( &discParam ); if( err != RFAL_ERR_NONE ) { ESP_LOGE(TAG, "Failed to call rfalNfcDiscover"); return ESP_FAIL; } - ESP_LOGI(TAG, "state %d", rfalNfcGetState()); + int64_t end = esp_timer_get_time() / 1000 + timeout_ms; - while(1) { + while(esp_timer_get_time() / 1000 < end) { rfalNfcWorker(); -// ESP_LOGI(TAG, "state %d", rfalNfcGetState()); - rtc_wdt_feed(); -// vTaskDelay(10 / portTICK_PERIOD_MS); + vTaskDelay(10 / portTICK_PERIOD_MS); if (rfalNfcIsDevActivated(rfalNfcGetState())) { rfalNfcGetActiveDevice( &nfcDevice ); vTaskDelay(50 / portTICK_PERIOD_MS); - ESP_LOGI(TAG, "Device type %d", nfcDevice->type); - rfalNfcDeactivate( RFAL_NFC_DEACTIVATE_DISCOVERY ); - vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_LOGD(TAG, "Discovered NFC device type=%d, uid=%s", nfcDevice->type, hex2Str(nfcDevice->nfcid, nfcDevice->nfcidLen )); + rfalNfcDeactivate( RFAL_NFC_DEACTIVATE_IDLE ); + + return ESP_OK; } } + rfalNfcDeactivate( RFAL_NFC_DEACTIVATE_IDLE ); + return ESP_ERR_TIMEOUT; +} + +esp_err_t st25r3911b_test() { + esp_err_t res; + + uint8_t id = 0; + res = st25r3911b_chip_id(&id); + if (res != ESP_OK) { + return res; + } + + switch (id) { + case 0x02: + ESP_LOGI(TAG, "silicon rev. r3.1"); + break; + case 0x03: + ESP_LOGI(TAG, "silicon rev. r3.3"); + break; + case 0x04: + ESP_LOGI(TAG, "silicon rev. r4.0"); + break; + case 0x05: + ESP_LOGI(TAG, "silicon rev. r4.1"); + break; + default: + ESP_LOGE(TAG, "Currently unknown silicon rev. 0x%02x", id); + return ESP_FAIL; + } + static rfalNfcDevice *nfcDevice; + return ESP_OK; } +esp_err_t st25r3911b_chip_id(uint8_t *id) { + if (global_st25r3911b == NULL) { + ESP_LOGE(TAG, "chip_id called before global device was initialized"); + } + return st25r3911CheckChipID(id) ? ESP_OK : ESP_FAIL; +} + +_Noreturn static void intr_task(void* arg) { + ST25R3911B* device = (ST25R3911B*) arg; + + while (1) { + if (xSemaphoreTake(device->intr_trigger, portMAX_DELAY)) { + ESP_LOGD(TAG, "Received interrupt"); + if (device->irq_callback != NULL) { + device->irq_callback(); + } else { + ESP_LOGI(TAG, "No NFC callback defined"); + } + } + } +} + +static void intr_handler(void* arg) { /* in interrupt handler */ + ST25R3911B* device = (ST25R3911B*) arg; + xSemaphoreGiveFromISR(device->intr_trigger, NULL); + portYIELD_FROM_ISR(); +} + esp_err_t st25r3911b_init(ST25R3911B *device) { esp_err_t res; if (device->pin_cs < 0) return ESP_FAIL; if (device->spi_speed > 6000000) return ESP_FAIL; - /*if (device->mutex == NULL) { - device->mutex = xSemaphoreCreateMutex(); - }*/ - - // if (device->mutex != NULL) xSemaphoreGive(device->mutex); - if (device->spi_device == NULL) { spi_device_interface_config_t devcfg = {.command_bits = 0, .address_bits = 0, @@ -306,7 +278,6 @@ esp_err_t st25r3911b_init(ST25R3911B *device) { .clock_speed_hz = device->spi_speed, .input_delay_ns = 0, .spics_io_num = -1, -// .flags = SPI_DEVICE_HALFDUPLEX, .queue_size = 1, .pre_cb = NULL, .post_cb = NULL}; @@ -314,7 +285,6 @@ esp_err_t st25r3911b_init(ST25R3911B *device) { if (res != ESP_OK) return res; } - /* Setup CS */ gpio_config_t dc_io_conf = { .intr_type = GPIO_INTR_DISABLE, @@ -325,15 +295,50 @@ esp_err_t st25r3911b_init(ST25R3911B *device) { }; res = gpio_config(&dc_io_conf); if (res != ESP_OK) return res; + res = gpio_set_level(device->pin_cs, true); + if (res != ESP_OK) return res; + + + if (device->pin_irq) { + // Create interrupt trigger + device->intr_trigger = xSemaphoreCreateBinary(); + if (device->intr_trigger == NULL) return ESP_ERR_NO_MEM; + + // Attach interrupt to interrupt pin (if available) + res = gpio_isr_handler_add(device->pin_irq, intr_handler, (void*) device); + if (res != ESP_OK) return res; + + gpio_config_t io_conf = { + .intr_type = GPIO_INTR_POSEDGE, + .mode = GPIO_MODE_INPUT, + .pin_bit_mask = 1LL << device->pin_irq, + .pull_down_en = 0, + .pull_up_en = 0, + }; + res = gpio_config(&io_conf); + if (res != ESP_OK) return res; + + xTaskCreate(&intr_task, "NFC interrupt task", 4096, device, 10, &device->intr_task_handle); + } global_st25r3911b = device; - return st25r_test(); + ReturnCode err; - // if (device->callback != NULL) { - // device->callback(false); - // } + err = st25r3911Initialize(); + if( err != RFAL_ERR_NONE ) { + ESP_LOGE(TAG, "failed to st25r3911Initialize: %d", err); + return ESP_FAIL; + } + + err = rfalNfcInitialize(); + if( err != RFAL_ERR_NONE ) { + ESP_LOGE(TAG, "failed to initialize"); + return ESP_FAIL; + } -// return ESP_OK; + ESP_LOGI(TAG, "Finished initializing. Starting self test"); + + return st25r3911b_test(); } diff --git a/components/troopers24-bsp b/components/troopers24-bsp index cf7e71e..389cf17 160000 --- a/components/troopers24-bsp +++ b/components/troopers24-bsp @@ -1 +1 @@ -Subproject commit cf7e71e611cbce548cd010b32e612136aa48a76d +Subproject commit 389cf173312dab3438e5aaa05d46b31ee6ec232b diff --git a/main/audio.c b/main/audio.c index 51dc1ab..a10b780 100644 --- a/main/audio.c +++ b/main/audio.c @@ -26,7 +26,7 @@ void _audio_init(int i2s_num) { i2s_pin_config_t pin_config = {.mck_io_num = -1, .bck_io_num = GPIO_I2S_BCLK, .ws_io_num = GPIO_I2S_WS, .data_out_num = GPIO_I2S_DATA, .data_in_num = I2S_PIN_NO_CHANGE}; -// i2s_set_pin(i2s_num, &pin_config); + i2s_set_pin(i2s_num, &pin_config); } typedef struct _audio_player_cfg { diff --git a/main/factory_test.c b/main/factory_test.c index aed80ba..8e10fe5 100644 --- a/main/factory_test.c +++ b/main/factory_test.c @@ -2,15 +2,16 @@ #include #include #include +#include #include #include -#include #include #include +#include #include -#include "filesystems.h" #include "audio.h" +#include "filesystems.h" #include "hardware.h" #include "pax_gfx.h" #include "settings.h" @@ -25,7 +26,7 @@ bool wait_for_key_pressed(Keyboard* keyboard, Key key) { keyboard_input_message_t buttonMessage = {0}; int i = 0; - while (i < 10) { + while (i < 20) { if (xQueueReceive(keyboard->queue, &buttonMessage, 1000 / portTICK_PERIOD_MS) == pdTRUE) { if (buttonMessage.state && buttonMessage.input == key) { return true; @@ -60,11 +61,22 @@ bool test_keyboard_init(uint32_t* rc) { *rc = (uint32_t) 2; return false; } + ESP_LOGI(TAG, "Press UP..."); + pax_simple_rect(pax_buffer, 0xFFFFFFFF, 0, pax_buffer->height - 36, pax_buffer->width, 36); + pax_draw_text(pax_buffer, 0xFF0000FF, font, 36, 0, pax_buffer->height - 36, "Press UP"); + display_flush(); + if (!wait_for_key_pressed(keyboard, JOYSTICK_UP)) { + ESP_LOGE(TAG, "Timeout reached"); + pax_simple_rect(pax_buffer, 0xFFFFFFFF, 0, pax_buffer->height - 36, pax_buffer->width, 36); + display_flush(); + *rc = (uint32_t) 2; + return false; + } pax_simple_rect(pax_buffer, 0xFFFFFFFF, 0, pax_buffer->height - 36, pax_buffer->width, 36); display_flush(); - return (keyboard != NULL); + return true; } bool test_sdcard_init(uint32_t* rc) { @@ -117,26 +129,74 @@ bool test_sdcard_init(uint32_t* rc) { bool test_stuck_buttons(uint32_t* rc) { Keyboard* keyboard = get_keyboard(); if (keyboard == NULL) { - *rc = (uint32_t) 1; + *rc = 0xFFFFFFFF - 1; return false; } - // TODO: Replace -// RP2040* rp2040 = get_rp2040(); - uint16_t state = 0; -// esp_err_t res = rp2040_read_buttons(rp2040, &state); -// if (res != ESP_OK) { -// *rc = 0xFFFFFFFF; -// return false; -// } + vTaskDelay(pdMS_TO_TICKS(500)); -// state &= ~(1 << FPGA_CDONE); // Ignore FPGA CDONE + uint16_t state; + + esp_err_t res = pca9555_get_gpio_values(keyboard->pca, &state); + if (res != ESP_OK) { + *rc = 0xFFFFFFFF - 2; + return false; + } + state &= 0x1ff; + + ESP_LOGI(TAG, "keyboard state: %04x", state); *rc = state; return (state == 0x0000); } +/* Test routines */ +bool test_nfc_init(uint32_t* rc) { + ST25R3911B* nfc = get_nfc(); + if (nfc == NULL) { + *rc = 0xFFFFFFFF - 1; + return false; + } + + uint8_t id = 0; + esp_err_t res = st25r3911b_chip_id(&id); + if (res != ESP_OK) { + *rc = 0xFFFFFFFF - 2; + return false; + } + + *rc = id; + + return (*rc == 0x05); +} + +bool test_nfc_read_uid(uint32_t* rc) { + ST25R3911B* nfc = get_nfc(); + if (nfc == NULL) { + *rc = 0xFFFFFFFF - 1; + return false; + } + + rfalNfcDevice nfcDevice = {0}; + bool found = false; + int tries = 30; + int remaining = tries; + + while (!found && remaining-- > 0) { + esp_err_t res = st25r3911b_discover(&nfcDevice, 1000); + if (res == ESP_ERR_TIMEOUT) { + continue; + } + if (res == ESP_OK) { + found = true; + } + } + + *rc = (uint32_t) tries - remaining; + return (found == true); +} + bool run_basic_tests() { pax_buf_t* pax_buffer = get_pax_buffer(); const pax_font_t* font; @@ -152,10 +212,12 @@ bool run_basic_tests() { /* Run mandatory tests */ RUN_TEST_MANDATORY("KEYBOARD", test_keyboard_init); + RUN_TEST_MANDATORY("NFC", test_nfc_init); /* Run tests */ RUN_TEST("STUCK BUTTONS", test_stuck_buttons); RUN_TEST("SD CARD", test_sdcard_init); + RUN_TEST("NFC READ", test_nfc_read_uid); error: /* Fail result on screen */ @@ -169,7 +231,7 @@ uint8_t led_red[NUM_LEDS*3] = {0}; uint8_t led_blue[NUM_LEDS*3] = {0}; uint8_t led_white[NUM_LEDS*3] = {0}; -void factory_test() { +_Noreturn void factory_test() { for (int i = 0; i < NUM_LEDS; i++) { led_green[3*i] = 50; led_green[3*i+1] = 0; @@ -191,6 +253,7 @@ void factory_test() { pax_buf_t* pax_buffer = get_pax_buffer(); uint8_t factory_test_done = nvs_get_u8_default("system", "factory_test", 0); if (!factory_test_done) { + st77xx_backlight(true); bool result; ESP_LOGI(TAG, "Factory test start"); @@ -218,7 +281,6 @@ void factory_test() { pax_background(pax_buffer, 0xa85a32); display_flush(); } - nvs_set_u8_fixed("system", "force_sponsors", 0x01); // Force showing sponsors on first boot wifi_set_defaults(); pax_noclip(pax_buffer); pax_background(pax_buffer, 0x00FF00); @@ -226,10 +288,13 @@ void factory_test() { ws2812_send_data(led_green, sizeof(led_green)); ESP_LOGI(TAG, "Make sure the speaker is NOT muted and a sound is playing"); + pax_draw_text(pax_buffer, 0xffff0000, pax_font_sky_mono, 36, 0, 20, "SUCCESS!"); + pax_draw_text(pax_buffer, 0xffff0000, pax_font_sky_mono, 16, 0, 56, "Does the speaker work?"); + display_flush(); while (true) { - if (result) play_bootsound(); - vTaskDelay(4000 / portTICK_PERIOD_MS); + play_bootsound(); + vTaskDelay(2000 / portTICK_PERIOD_MS); } } diff --git a/main/include/factory_test.h b/main/include/factory_test.h index 713f3c1..6968f02 100644 --- a/main/include/factory_test.h +++ b/main/include/factory_test.h @@ -1,3 +1,4 @@ +#include #pragma once -void factory_test(); +_Noreturn void factory_test(); diff --git a/main/include/wifi_defaults.h b/main/include/wifi_defaults.h index ae41274..eacfe74 100644 --- a/main/include/wifi_defaults.h +++ b/main/include/wifi_defaults.h @@ -6,9 +6,9 @@ #include "esp_wifi_types.h" #include "esp_wpa2.h" -// Camp WiFi settings. +// TROOPERS WiFi settings. #define WIFI_TROOPERS_SSID "trp-badge" -#define WIFI_TROOPERS_PASSWORD "5EILZYY-kAGxzLhFrLjln3ThO6qLUd" +#define WIFI_TROOPERS_PASSWORD "TroopersBadge24" #define WIFI_TROOPERS_AUTH WIFI_AUTH_WPA2_PSK bool wifi_set_defaults(); diff --git a/main/main.c b/main/main.c index 325fd03..2ce59b3 100644 --- a/main/main.c +++ b/main/main.c @@ -167,11 +167,10 @@ _Noreturn void app_main(void) { esp_restart(); } - - /* Initialize the LEDs */ ws2812_init(GPIO_LED_DATA, 150); - const uint8_t led_off[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + const uint8_t led_off[NUM_LEDS * 3]; + memset((void*) led_off, 0, NUM_LEDS * 3); ws2812_send_data(led_off, sizeof(led_off)); /* Enable the amplifier */ @@ -188,6 +187,28 @@ _Noreturn void app_main(void) { pca9555_set_gpio_value(io_expander, IO_AMP_GAIN0, 1); pca9555_set_gpio_value(io_expander, IO_AMP_GAIN1, 1); + /* Start NVS */ + res = nvs_init(); + if (res != ESP_OK) { + ESP_LOGE(TAG, "NVS init failed: %d", res); + wait_for_boot_anim(); + display_fatal_error(fatal_error_str, "NVS failed to initialize", "Flash may be corrupted", NULL); + stop(); + } + + nvs_handle_t handle; + res = nvs_open("system", NVS_READWRITE, &handle); + if (res != ESP_OK) { + ESP_LOGE(TAG, "NVS open failed: %d", res); + wait_for_boot_anim(); + display_fatal_error(fatal_error_str, "Failed to open NVS namespace", "Flash may be corrupted", reset_board_str); + stop(); + } + + // TODO: This is resetting the factory test status, so that factory test will run on every boot + nvs_set_u8_fixed("system", "factory_test", 0x00); + factory_test(); + /* Initialize LCD screen */ pax_buf_t* pax_buffer = get_pax_buffer(); xTaskCreate(boot_animation_task, "boot_anim_task", 4096, NULL, 12, NULL); @@ -218,31 +239,12 @@ _Noreturn void app_main(void) { st77xx_backlight(true); #endif + if (!wakeup_deepsleep) { /* TROOPERS */ xTaskCreate(audio_player_task, "audio_player_task", 2048, NULL, 12, NULL); } - /* Start NVS */ - res = nvs_init(); - if (res != ESP_OK) { - ESP_LOGE(TAG, "NVS init failed: %d", res); - wait_for_boot_anim(); - display_fatal_error(fatal_error_str, "NVS failed to initialize", "Flash may be corrupted", NULL); - stop(); - } - - nvs_handle_t handle; - res = nvs_open("system", NVS_READWRITE, &handle); - if (res != ESP_OK) { - ESP_LOGE(TAG, "NVS open failed: %d", res); - wait_for_boot_anim(); - display_fatal_error(fatal_error_str, "Failed to open NVS namespace", "Flash may be corrupted", reset_board_str); - stop(); - } - -// factory_test(); - /* Start AppFS */ res = appfs_init(); if (res != ESP_OK) { diff --git a/sdkconfig b/sdkconfig index 78ecefc..889d320 100644 --- a/sdkconfig +++ b/sdkconfig @@ -762,7 +762,7 @@ CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER=y CONFIG_FREERTOS_CORETIMER_0=y # CONFIG_FREERTOS_CORETIMER_1 is not set CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y -CONFIG_FREERTOS_HZ=100 +CONFIG_FREERTOS_HZ=1000 CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set # CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set @@ -834,13 +834,14 @@ CONFIG_HEAP_TRACING_OFF=y # CONFIG_LOG_DEFAULT_LEVEL_NONE is not set # CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set # CONFIG_LOG_DEFAULT_LEVEL_WARN is not set -# CONFIG_LOG_DEFAULT_LEVEL_INFO is not set -CONFIG_LOG_DEFAULT_LEVEL_DEBUG=y +CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set # CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set -CONFIG_LOG_DEFAULT_LEVEL=4 +CONFIG_LOG_DEFAULT_LEVEL=3 CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y +# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set # CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set -CONFIG_LOG_MAXIMUM_LEVEL=4 +CONFIG_LOG_MAXIMUM_LEVEL=3 CONFIG_LOG_COLORS=y CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y # CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set