diff --git a/.travis.yml b/.travis.yml index 2fc44116cf..06231a5945 100755 --- a/.travis.yml +++ b/.travis.yml @@ -66,9 +66,6 @@ before_script: - (! var_search "${TRAVIS_SDK-}" arm || (wget https://s3.amazonaws.com/adafruit-circuit-python/gcc-arm-embedded_7-2018q2-1~xenial1_amd64.deb && sudo dpkg -i gcc-arm-embedded*_amd64.deb)) - # For nrf builds - - (! var_search "${TRAVIS_SDK-}" nrf || sudo ports/nrf/bluetooth/download_ble_stack.sh) - # For huzzah builds - (! var_search "${TRAVIS_SDK-}" esp8266 || (wget https://github.com/jepler/esp-open-sdk/releases/download/2018-06-10/xtensa-lx106-elf-standalone.tar.gz && tar -C .. -xaf xtensa-lx106-elf-standalone.tar.gz)) - if var_search "${TRAVIS_SDK-}" esp8266 ; then PATH=$(readlink -f ../xtensa-lx106-elf/bin):$PATH; fi diff --git a/README.rst b/README.rst index 13672b689c..deb085522e 100644 --- a/README.rst +++ b/README.rst @@ -157,7 +157,7 @@ Behavior API ~~~ -- Unified hardware APIs: `audioio `_, `analogio `_, `busio `_, `digitalio `_, `pulseio `_, `touchio `_, `microcontroller `_, `board `_, `bitbangio `_ +- Unified hardware APIs: `audioio `_, `analogio `_, `bleio `_, `busio `_, `digitalio `_, `pulseio `_, `touchio `_, `microcontroller `_, `board `_, `bitbangio `_ - No ``machine`` API on Atmel SAMD21 port. Modules diff --git a/docs/drivers.rst b/docs/drivers.rst index 119706d33c..fcd94bc3b8 100644 --- a/docs/drivers.rst +++ b/docs/drivers.rst @@ -213,7 +213,7 @@ These provide functionality similar to `analogio`, `digitalio`, `pulseio`, and ` Adafruit SeeSaw ADS1x15 Analog-to-Digital Converter - Crickit Robotics Boards < + Crickit Robotics Boards DS2413 OneWire GPIO Expander FocalTech Capacitive Touch MCP230xx GPIO Expander diff --git a/locale/ID.po b/locale/ID.po index 405b3a0e3f..952e12d4d3 100644 --- a/locale/ID.po +++ b/locale/ID.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-10 11:05-0800\n" +"POT-Creation-Date: 2019-01-10 21:32-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -409,17 +409,20 @@ msgstr "Channel EXTINT sedang digunakan" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:118 #: ports/esp8266/common-hal/pulseio/PulseIn.c:86 +#: ports/nrf/common-hal/pulseio/PulseIn.c:129 #, c-format msgid "Failed to allocate RX buffer of %d bytes" msgstr "Gagal untuk megalokasikan buffer RX dari %d byte" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:205 #: ports/esp8266/common-hal/pulseio/PulseIn.c:151 +#: ports/nrf/common-hal/pulseio/PulseIn.c:254 msgid "pop from an empty PulseIn" msgstr "Muncul dari PulseIn yang kosong" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422 +#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 +#: ports/nrf/common-hal/pulseio/PulseIn.c:241 py/obj.c:422 msgid "index out of range" msgstr "index keluar dari jangkauan" @@ -659,123 +662,185 @@ msgstr "fungsionalitas AnalogOut tidak didukung" msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" msgstr "Dukungan soft device, id: 0x%08lX, pc: 0x%08l" -#: ports/nrf/common-hal/bleio/Adapter.c:125 -#, c-format -msgid "Failed to change softdevice state, error: 0x%08lX" +#: ports/nrf/common-hal/bleio/Adapter.c:110 +#, fuzzy +msgid "Failed to change softdevice state" msgstr "Gagal untuk merubah status softdevice, error: 0x%08lX" -#: ports/nrf/common-hal/bleio/Adapter.c:135 -#, c-format -msgid "Failed to get softdevice state, error: 0x%08lX" +#: ports/nrf/common-hal/bleio/Adapter.c:119 +#, fuzzy +msgid "Failed to get softdevice state" msgstr "Gagal untuk mendapatkan status softdevice, error: 0x%08lX" -#: ports/nrf/common-hal/bleio/Adapter.c:155 -#, c-format -msgid "Failed to get local address, error: 0x%08lX" +#: ports/nrf/common-hal/bleio/Adapter.c:138 +#, fuzzy +msgid "Failed to get local address" msgstr "Gagal untuk mendapatkan alamat lokal, error: 0x%08lX" -#: ports/nrf/common-hal/bleio/Characteristic.c:52 -#, c-format -msgid "Failed to write gatts value, status: 0x%08lX" -msgstr "Gagal untuk menulis nilai gatts, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Broadcaster.c:48 +msgid "interval not in range 0.0020 to 10.24" +msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:76 -#, c-format -msgid "Failed to notify attribute value, status: 0x%08lX" -msgstr "Gagal untuk melaporkan nilai atribut, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Characteristic.c:91 -#, c-format -msgid "Failed to read attribute value, status: 0x%08lX" -msgstr "Gagal untuk membaca nilai atribut, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Characteristic.c:119 -#: ports/nrf/common-hal/bleio/Device.c:272 -#: ports/nrf/common-hal/bleio/Device.c:307 -#, c-format -msgid "Failed to acquire mutex, status: 0x%08lX" -msgstr "Gagal untuk mendapatkan mutex, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Characteristic.c:126 -#, c-format -msgid "Failed to write attribute value, status: 0x%08lX" -msgstr "Gagal untuk menulis nilai atribut, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Characteristic.c:138 -#: ports/nrf/common-hal/bleio/Device.c:284 -#: ports/nrf/common-hal/bleio/Device.c:319 -#: ports/nrf/common-hal/bleio/Device.c:354 -#: ports/nrf/common-hal/bleio/Device.c:391 -#, c-format -msgid "Failed to release mutex, status: 0x%08lX" -msgstr "Gagal untuk melepaskan mutex, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Device.c:81 -#: ports/nrf/common-hal/bleio/Device.c:114 -msgid "Can not fit data into the advertisment packet" +#: ports/nrf/common-hal/bleio/Broadcaster.c:58 +#: ports/nrf/common-hal/bleio/Peripheral.c:56 +#, fuzzy +msgid "Data too large for advertisement packet" msgstr "Tidak bisa menyesuaikan data ke dalam paket advertisment" -#: ports/nrf/common-hal/bleio/Device.c:266 +#: ports/nrf/common-hal/bleio/Broadcaster.c:83 +#: ports/nrf/common-hal/bleio/Peripheral.c:324 #, fuzzy, c-format -msgid "Failed to discover serivices, status: 0x%08lX" -msgstr "Gagal untuk menemukan layanan, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Device.c:403 -#: ports/nrf/common-hal/bleio/Scanner.c:76 -#, c-format -msgid "Failed to continue scanning, status: 0x%0xlX" -msgstr "Gagal untuk melanjutkan scanning, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Device.c:436 -#, c-format -msgid "Failed to connect, status: 0x%08lX" -msgstr "Gagal untuk menyambungkan, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Device.c:513 -#, c-format -msgid "Failed to add service, status: 0x%08lX" -msgstr "Gagal untuk menambahkan layanan, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Device.c:531 -#, c-format -msgid "Failed to start advertisment, status: 0x%08lX" +msgid "Failed to start advertising, err 0x%04x" msgstr "Gagal untuk memulai advertisement, status: 0x%08lX" -#: ports/nrf/common-hal/bleio/Device.c:549 -#, c-format -msgid "Failed to stop advertisment, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Broadcaster.c:96 +#: ports/nrf/common-hal/bleio/Peripheral.c:336 +#, fuzzy, c-format +msgid "Failed to stop advertising, err 0x%04x" msgstr "Gagal untuk memberhentikan advertisement, status: 0x%08lX" -#: ports/nrf/common-hal/bleio/Device.c:575 -#: ports/nrf/common-hal/bleio/Scanner.c:103 -#, c-format -msgid "Failed to start scanning, status: 0x%0xlX" +#: ports/nrf/common-hal/bleio/Characteristic.c:59 +#, fuzzy, c-format +msgid "Failed to read CCCD value, err 0x%04x" +msgstr "Gagal untuk membaca nilai atribut, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:89 +#, fuzzy, c-format +msgid "Failed to read gatts value, err 0x%04x" +msgstr "Gagal untuk menulis nilai gatts, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:106 +#, fuzzy, c-format +msgid "Failed to write gatts value, err 0x%04x" +msgstr "Gagal untuk menulis nilai gatts, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:132 +#, fuzzy, c-format +msgid "Failed to notify or indicate attribute value, err %0x04x" +msgstr "Gagal untuk melaporkan nilai atribut, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:144 +#, fuzzy, c-format +msgid "Failed to read attribute value, err %0x04x" +msgstr "Gagal untuk membaca nilai atribut, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:172 +#, fuzzy, c-format +msgid "Failed to acquire mutex, err 0x%04x" +msgstr "Gagal untuk mendapatkan mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:178 +#, fuzzy, c-format +msgid "Failed to write attribute value, err 0x%04x" +msgstr "Gagal untuk menulis nilai atribut, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:189 +#, fuzzy, c-format +msgid "Failed to release mutex, err 0x%04x" +msgstr "Gagal untuk melepaskan mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:251 +#: ports/nrf/common-hal/bleio/Characteristic.c:284 +msgid "bad GATT role" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:80 +#: ports/nrf/common-hal/bleio/Device.c:112 +#, fuzzy +msgid "Data too large for the advertisement packet" +msgstr "Tidak bisa menyesuaikan data ke dalam paket advertisment" + +#: ports/nrf/common-hal/bleio/Device.c:262 +#, fuzzy +msgid "Failed to discover services" +msgstr "Gagal untuk menemukan layanan, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:267 +#: ports/nrf/common-hal/bleio/Device.c:300 +#, fuzzy +msgid "Failed to acquire mutex" +msgstr "Gagal untuk mendapatkan mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:278 +#: ports/nrf/common-hal/bleio/Device.c:311 +#: ports/nrf/common-hal/bleio/Device.c:342 +#: ports/nrf/common-hal/bleio/Device.c:376 +#, fuzzy +msgid "Failed to release mutex" +msgstr "Gagal untuk melepaskan mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:387 +#, fuzzy +msgid "Failed to continue scanning" +msgstr "Gagal untuk melanjutkan scanning, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:419 +#, fuzzy +msgid "Failed to connect:" +msgstr "Gagal untuk menyambungkan, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:489 +#, fuzzy +msgid "Failed to add service" +msgstr "Gagal untuk menambahkan layanan, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:506 +#, fuzzy +msgid "Failed to start advertising" +msgstr "Gagal untuk memulai advertisement, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:523 +#, fuzzy +msgid "Failed to stop advertising" +msgstr "Gagal untuk memberhentikan advertisement, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:548 +#, fuzzy +msgid "Failed to start scanning" msgstr "Gagal untuk melakukan scanning, status: 0x%08lX" -#: ports/nrf/common-hal/bleio/Device.c:592 -#, c-format -msgid "Failed to create mutex, status: 0x%0xlX" +#: ports/nrf/common-hal/bleio/Device.c:564 +#, fuzzy +msgid "Failed to create mutex" msgstr "Gagal untuk membuat mutex, status: 0x%08lX" -#: ports/nrf/common-hal/bleio/Service.c:83 -#, c-format -msgid "Failed to add characteristic, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Peripheral.c:304 +#, fuzzy, c-format +msgid "Failed to add service, err 0x%04x" +msgstr "Gagal untuk menambahkan layanan, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Scanner.c:75 +#, fuzzy, c-format +msgid "Failed to continue scanning, err 0x%04x" +msgstr "Gagal untuk melanjutkan scanning, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Scanner.c:101 +#, fuzzy, c-format +msgid "Failed to start scanning, err 0x%04x" +msgstr "Gagal untuk melakukan scanning, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Service.c:88 +#, fuzzy, c-format +msgid "Failed to add characteristic, err 0x%04x" msgstr "Gagal untuk menambahkan karakteristik, status: 0x%08lX" -#: ports/nrf/common-hal/bleio/UUID.c:97 -#, c-format -msgid "Failed to add Vendor Specific UUID, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Service.c:92 +msgid "Characteristic already in use by another Service." +msgstr "" + +#: ports/nrf/common-hal/bleio/UUID.c:54 +#, fuzzy, c-format +msgid "Failed to register Vendor-Specific UUID, err 0x%04x" msgstr "Gagal untuk menambahkan Vendor Spesific UUID, status: 0x%08lX" -#: ports/nrf/common-hal/bleio/UUID.c:102 -msgid "Invalid UUID string length" -msgstr "Panjang string UUID tidak valid" +#: ports/nrf/common-hal/bleio/UUID.c:73 +#, c-format +msgid "Could not decode ble_uuid, err 0x%04x" +msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:109 -#: shared-bindings/bleio/Characteristic.c:125 -#: shared-bindings/bleio/Service.c:105 -msgid "Invalid UUID parameter" -msgstr "Parameter UUID tidak valid" +#: ports/nrf/common-hal/bleio/UUID.c:88 +msgid "Unexpected nrfx uuid type" +msgstr "" #: ports/nrf/common-hal/busio/I2C.c:98 msgid "All I2C peripherals are in use" @@ -806,9 +871,9 @@ msgstr "Parity ganjil tidak didukung" msgid "busio.UART not available" msgstr "busio.UART tidak tersedia" -#: ports/nrf/common-hal/microcontroller/Processor.c:49 -#, c-format -msgid "Can not get temperature. status: 0x%02x" +#: ports/nrf/common-hal/microcontroller/Processor.c:48 +#, fuzzy +msgid "Cannot get temperature" msgstr "Tidak bisa mendapatkan temperatur. status: 0x%02x" #: ports/nrf/common-hal/pulseio/PWMOut.c:161 @@ -1946,7 +2011,7 @@ msgstr "" msgid "memory allocation failed, allocating %u bytes" msgstr "" -#: py/runtime.c:1609 +#: py/runtime.c:1620 msgid "maximum recursion depth exceeded" msgstr "" @@ -2096,12 +2161,28 @@ msgstr "" msgid "buffer slices must be of equal length" msgstr "" -#: shared-bindings/bleio/Address.c:101 -msgid "Wrong address length" +#: shared-bindings/bleio/Address.c:119 +#, c-format +msgid "Address is not %d bytes long or is in wrong format" msgstr "" -#: shared-bindings/bleio/Address.c:107 -msgid "Wrong number of bytes provided" +#: shared-bindings/bleio/Address.c:126 +#, fuzzy, c-format +msgid "Address must be %d bytes long" +msgstr "buffers harus mempunyai panjang yang sama" + +#: shared-bindings/bleio/Characteristic.c:81 +#: shared-bindings/bleio/Descriptor.c:93 shared-bindings/bleio/Service.c:78 +msgid "Expected a UUID" +msgstr "" + +#: shared-bindings/bleio/CharacteristicBuffer.c:68 +#, fuzzy +msgid "buffer_size must be >= 1" +msgstr "buffers harus mempunyai panjang yang sama" + +#: shared-bindings/bleio/CharacteristicBuffer.c:72 +msgid "Expected a Characteristic" msgstr "" #: shared-bindings/bleio/Device.c:210 @@ -2120,6 +2201,40 @@ msgstr "" msgid "Can't advertise in Central mode" msgstr "" +#: shared-bindings/bleio/Peripheral.c:111 +msgid "services includes an object that is not a Service" +msgstr "" + +#: shared-bindings/bleio/Peripheral.c:124 +#, fuzzy +msgid "name must be a string" +msgstr "keyword harus berupa string" + +#: shared-bindings/bleio/Service.c:90 +msgid "characteristics includes an object that is not a Characteristic" +msgstr "" + +#: shared-bindings/bleio/Service.c:96 +msgid "Characteristic UUID doesn't match Service UUID" +msgstr "" + +#: shared-bindings/bleio/UUID.c:66 +msgid "UUID integer value not in range 0 to 0xffff" +msgstr "" + +#: shared-bindings/bleio/UUID.c:75 +msgid "UUID value is not int or byte buffer" +msgstr "" + +#: shared-bindings/bleio/UUID.c:79 +#, fuzzy +msgid "Byte buffer must be 16 bytes." +msgstr "buffers harus mempunyai panjang yang sama" + +#: shared-bindings/bleio/UUID.c:120 +msgid "not a 128-bit UUID" +msgstr "" + #: shared-bindings/busio/I2C.c:120 msgid "Function requires lock." msgstr "" @@ -2570,6 +2685,12 @@ msgid "" "exit safe mode.\n" msgstr "" +#~ msgid "Invalid UUID string length" +#~ msgstr "Panjang string UUID tidak valid" + +#~ msgid "Invalid UUID parameter" +#~ msgstr "Parameter UUID tidak valid" + #~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n" #~ msgstr "" #~ "Sepertinya inti kode CircuitPython kita crash dengan sangat keras. Ups!\n" diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot index dd7df915ff..5c85d09a80 100644 --- a/locale/circuitpython.pot +++ b/locale/circuitpython.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-10 11:05-0800\n" +"POT-Creation-Date: 2019-01-10 21:32-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -400,17 +400,20 @@ msgstr "" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:118 #: ports/esp8266/common-hal/pulseio/PulseIn.c:86 +#: ports/nrf/common-hal/pulseio/PulseIn.c:129 #, c-format msgid "Failed to allocate RX buffer of %d bytes" msgstr "" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:205 #: ports/esp8266/common-hal/pulseio/PulseIn.c:151 +#: ports/nrf/common-hal/pulseio/PulseIn.c:254 msgid "pop from an empty PulseIn" msgstr "" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422 +#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 +#: ports/nrf/common-hal/pulseio/PulseIn.c:241 py/obj.c:422 msgid "index out of range" msgstr "" @@ -648,122 +651,169 @@ msgstr "" msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:125 +#: ports/nrf/common-hal/bleio/Adapter.c:110 +msgid "Failed to change softdevice state" +msgstr "" + +#: ports/nrf/common-hal/bleio/Adapter.c:119 +msgid "Failed to get softdevice state" +msgstr "" + +#: ports/nrf/common-hal/bleio/Adapter.c:138 +msgid "Failed to get local address" +msgstr "" + +#: ports/nrf/common-hal/bleio/Broadcaster.c:48 +msgid "interval not in range 0.0020 to 10.24" +msgstr "" + +#: ports/nrf/common-hal/bleio/Broadcaster.c:58 +#: ports/nrf/common-hal/bleio/Peripheral.c:56 +msgid "Data too large for advertisement packet" +msgstr "" + +#: ports/nrf/common-hal/bleio/Broadcaster.c:83 +#: ports/nrf/common-hal/bleio/Peripheral.c:324 #, c-format -msgid "Failed to change softdevice state, error: 0x%08lX" +msgid "Failed to start advertising, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:135 +#: ports/nrf/common-hal/bleio/Broadcaster.c:96 +#: ports/nrf/common-hal/bleio/Peripheral.c:336 #, c-format -msgid "Failed to get softdevice state, error: 0x%08lX" +msgid "Failed to stop advertising, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:155 +#: ports/nrf/common-hal/bleio/Characteristic.c:59 #, c-format -msgid "Failed to get local address, error: 0x%08lX" +msgid "Failed to read CCCD value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:52 +#: ports/nrf/common-hal/bleio/Characteristic.c:89 #, c-format -msgid "Failed to write gatts value, status: 0x%08lX" +msgid "Failed to read gatts value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:76 +#: ports/nrf/common-hal/bleio/Characteristic.c:106 #, c-format -msgid "Failed to notify attribute value, status: 0x%08lX" +msgid "Failed to write gatts value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:91 +#: ports/nrf/common-hal/bleio/Characteristic.c:132 #, c-format -msgid "Failed to read attribute value, status: 0x%08lX" +msgid "Failed to notify or indicate attribute value, err %0x04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:119 -#: ports/nrf/common-hal/bleio/Device.c:272 -#: ports/nrf/common-hal/bleio/Device.c:307 +#: ports/nrf/common-hal/bleio/Characteristic.c:144 #, c-format -msgid "Failed to acquire mutex, status: 0x%08lX" +msgid "Failed to read attribute value, err %0x04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:126 +#: ports/nrf/common-hal/bleio/Characteristic.c:172 #, c-format -msgid "Failed to write attribute value, status: 0x%08lX" +msgid "Failed to acquire mutex, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:138 -#: ports/nrf/common-hal/bleio/Device.c:284 -#: ports/nrf/common-hal/bleio/Device.c:319 -#: ports/nrf/common-hal/bleio/Device.c:354 -#: ports/nrf/common-hal/bleio/Device.c:391 +#: ports/nrf/common-hal/bleio/Characteristic.c:178 #, c-format -msgid "Failed to release mutex, status: 0x%08lX" +msgid "Failed to write attribute value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:81 -#: ports/nrf/common-hal/bleio/Device.c:114 -msgid "Can not fit data into the advertisment packet" -msgstr "" - -#: ports/nrf/common-hal/bleio/Device.c:266 +#: ports/nrf/common-hal/bleio/Characteristic.c:189 #, c-format -msgid "Failed to discover serivices, status: 0x%08lX" +msgid "Failed to release mutex, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:403 -#: ports/nrf/common-hal/bleio/Scanner.c:76 +#: ports/nrf/common-hal/bleio/Characteristic.c:251 +#: ports/nrf/common-hal/bleio/Characteristic.c:284 +msgid "bad GATT role" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:80 +#: ports/nrf/common-hal/bleio/Device.c:112 +msgid "Data too large for the advertisement packet" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:262 +msgid "Failed to discover services" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:267 +#: ports/nrf/common-hal/bleio/Device.c:300 +msgid "Failed to acquire mutex" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:278 +#: ports/nrf/common-hal/bleio/Device.c:311 +#: ports/nrf/common-hal/bleio/Device.c:342 +#: ports/nrf/common-hal/bleio/Device.c:376 +msgid "Failed to release mutex" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:387 +msgid "Failed to continue scanning" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:419 +msgid "Failed to connect:" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:489 +msgid "Failed to add service" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:506 +msgid "Failed to start advertising" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:523 +msgid "Failed to stop advertising" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:548 +msgid "Failed to start scanning" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:564 +msgid "Failed to create mutex" +msgstr "" + +#: ports/nrf/common-hal/bleio/Peripheral.c:304 #, c-format -msgid "Failed to continue scanning, status: 0x%0xlX" +msgid "Failed to add service, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:436 +#: ports/nrf/common-hal/bleio/Scanner.c:75 #, c-format -msgid "Failed to connect, status: 0x%08lX" +msgid "Failed to continue scanning, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:513 +#: ports/nrf/common-hal/bleio/Scanner.c:101 #, c-format -msgid "Failed to add service, status: 0x%08lX" +msgid "Failed to start scanning, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:531 +#: ports/nrf/common-hal/bleio/Service.c:88 #, c-format -msgid "Failed to start advertisment, status: 0x%08lX" +msgid "Failed to add characteristic, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:549 +#: ports/nrf/common-hal/bleio/Service.c:92 +msgid "Characteristic already in use by another Service." +msgstr "" + +#: ports/nrf/common-hal/bleio/UUID.c:54 #, c-format -msgid "Failed to stop advertisment, status: 0x%08lX" +msgid "Failed to register Vendor-Specific UUID, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:575 -#: ports/nrf/common-hal/bleio/Scanner.c:103 +#: ports/nrf/common-hal/bleio/UUID.c:73 #, c-format -msgid "Failed to start scanning, status: 0x%0xlX" +msgid "Could not decode ble_uuid, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:592 -#, c-format -msgid "Failed to create mutex, status: 0x%0xlX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Service.c:83 -#, c-format -msgid "Failed to add characteristic, status: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/UUID.c:97 -#, c-format -msgid "Failed to add Vendor Specific UUID, status: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/UUID.c:102 -msgid "Invalid UUID string length" -msgstr "" - -#: ports/nrf/common-hal/bleio/UUID.c:109 -#: shared-bindings/bleio/Characteristic.c:125 -#: shared-bindings/bleio/Service.c:105 -msgid "Invalid UUID parameter" +#: ports/nrf/common-hal/bleio/UUID.c:88 +msgid "Unexpected nrfx uuid type" msgstr "" #: ports/nrf/common-hal/busio/I2C.c:98 @@ -795,9 +845,8 @@ msgstr "" msgid "busio.UART not available" msgstr "" -#: ports/nrf/common-hal/microcontroller/Processor.c:49 -#, c-format -msgid "Can not get temperature. status: 0x%02x" +#: ports/nrf/common-hal/microcontroller/Processor.c:48 +msgid "Cannot get temperature" msgstr "" #: ports/nrf/common-hal/pulseio/PWMOut.c:161 @@ -1929,7 +1978,7 @@ msgstr "" msgid "memory allocation failed, allocating %u bytes" msgstr "" -#: py/runtime.c:1609 +#: py/runtime.c:1620 msgid "maximum recursion depth exceeded" msgstr "" @@ -2079,12 +2128,27 @@ msgstr "" msgid "buffer slices must be of equal length" msgstr "" -#: shared-bindings/bleio/Address.c:101 -msgid "Wrong address length" +#: shared-bindings/bleio/Address.c:119 +#, c-format +msgid "Address is not %d bytes long or is in wrong format" msgstr "" -#: shared-bindings/bleio/Address.c:107 -msgid "Wrong number of bytes provided" +#: shared-bindings/bleio/Address.c:126 +#, c-format +msgid "Address must be %d bytes long" +msgstr "" + +#: shared-bindings/bleio/Characteristic.c:81 +#: shared-bindings/bleio/Descriptor.c:93 shared-bindings/bleio/Service.c:78 +msgid "Expected a UUID" +msgstr "" + +#: shared-bindings/bleio/CharacteristicBuffer.c:68 +msgid "buffer_size must be >= 1" +msgstr "" + +#: shared-bindings/bleio/CharacteristicBuffer.c:72 +msgid "Expected a Characteristic" msgstr "" #: shared-bindings/bleio/Device.c:210 @@ -2103,6 +2167,38 @@ msgstr "" msgid "Can't advertise in Central mode" msgstr "" +#: shared-bindings/bleio/Peripheral.c:111 +msgid "services includes an object that is not a Service" +msgstr "" + +#: shared-bindings/bleio/Peripheral.c:124 +msgid "name must be a string" +msgstr "" + +#: shared-bindings/bleio/Service.c:90 +msgid "characteristics includes an object that is not a Characteristic" +msgstr "" + +#: shared-bindings/bleio/Service.c:96 +msgid "Characteristic UUID doesn't match Service UUID" +msgstr "" + +#: shared-bindings/bleio/UUID.c:66 +msgid "UUID integer value not in range 0 to 0xffff" +msgstr "" + +#: shared-bindings/bleio/UUID.c:75 +msgid "UUID value is not int or byte buffer" +msgstr "" + +#: shared-bindings/bleio/UUID.c:79 +msgid "Byte buffer must be 16 bytes." +msgstr "" + +#: shared-bindings/bleio/UUID.c:120 +msgid "not a 128-bit UUID" +msgstr "" + #: shared-bindings/busio/I2C.c:120 msgid "Function requires lock." msgstr "" diff --git a/locale/de_DE.po b/locale/de_DE.po index 8792ce8347..47098b66ac 100644 --- a/locale/de_DE.po +++ b/locale/de_DE.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-10 11:05-0800\n" +"POT-Creation-Date: 2019-01-10 21:32-0500\n" "PO-Revision-Date: 2018-07-27 11:55-0700\n" "Last-Translator: Sebastian Plamauer\n" "Language-Team: \n" @@ -404,17 +404,20 @@ msgstr "EXTINT Kanal wird benutzt" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:118 #: ports/esp8266/common-hal/pulseio/PulseIn.c:86 +#: ports/nrf/common-hal/pulseio/PulseIn.c:129 #, c-format msgid "Failed to allocate RX buffer of %d bytes" msgstr "Konnte keine RX Buffer mit %d allozieren" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:205 #: ports/esp8266/common-hal/pulseio/PulseIn.c:151 +#: ports/nrf/common-hal/pulseio/PulseIn.c:254 msgid "pop from an empty PulseIn" msgstr "pop von einem leeren PulseIn" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422 +#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 +#: ports/nrf/common-hal/pulseio/PulseIn.c:241 py/obj.c:422 msgid "index out of range" msgstr "index außerhalb der Reichweite" @@ -655,124 +658,184 @@ msgstr "" msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:125 -#, c-format -msgid "Failed to change softdevice state, error: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Adapter.c:135 -#, c-format -msgid "Failed to get softdevice state, error: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Adapter.c:155 -#, c-format -msgid "Failed to get local address, error: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Characteristic.c:52 -#, fuzzy, c-format -msgid "Failed to write gatts value, status: 0x%08lX" -msgstr "Kann den Attributwert nicht schreiben. Status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Characteristic.c:76 -#, fuzzy, c-format -msgid "Failed to notify attribute value, status: 0x%08lX" -msgstr "Kann den Attributwert nicht mitteilen. Status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Characteristic.c:91 -#, fuzzy, c-format -msgid "Failed to read attribute value, status: 0x%08lX" -msgstr "Kann den Attributwert nicht lesen. Status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Characteristic.c:119 -#: ports/nrf/common-hal/bleio/Device.c:272 -#: ports/nrf/common-hal/bleio/Device.c:307 -#, c-format -msgid "Failed to acquire mutex, status: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Characteristic.c:126 -#, fuzzy, c-format -msgid "Failed to write attribute value, status: 0x%08lX" -msgstr "Kann den Attributwert nicht schreiben. Status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Characteristic.c:138 -#: ports/nrf/common-hal/bleio/Device.c:284 -#: ports/nrf/common-hal/bleio/Device.c:319 -#: ports/nrf/common-hal/bleio/Device.c:354 -#: ports/nrf/common-hal/bleio/Device.c:391 -#, c-format -msgid "Failed to release mutex, status: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Device.c:81 -#: ports/nrf/common-hal/bleio/Device.c:114 +#: ports/nrf/common-hal/bleio/Adapter.c:110 #, fuzzy -msgid "Can not fit data into the advertisment packet" +msgid "Failed to change softdevice state" +msgstr "Kann advertisement nicht stoppen. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Adapter.c:119 +#, fuzzy +msgid "Failed to get softdevice state" +msgstr "Kann advertisement nicht stoppen. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Adapter.c:138 +msgid "Failed to get local address" +msgstr "" + +#: ports/nrf/common-hal/bleio/Broadcaster.c:48 +msgid "interval not in range 0.0020 to 10.24" +msgstr "" + +#: ports/nrf/common-hal/bleio/Broadcaster.c:58 +#: ports/nrf/common-hal/bleio/Peripheral.c:56 +#, fuzzy +msgid "Data too large for advertisement packet" msgstr "Daten können nicht in das advertisement packet eingefügt werden." -#: ports/nrf/common-hal/bleio/Device.c:266 -#, c-format -msgid "Failed to discover serivices, status: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Device.c:403 -#: ports/nrf/common-hal/bleio/Scanner.c:76 +#: ports/nrf/common-hal/bleio/Broadcaster.c:83 +#: ports/nrf/common-hal/bleio/Peripheral.c:324 #, fuzzy, c-format -msgid "Failed to continue scanning, status: 0x%0xlX" -msgstr "Der Scanvorgang kann nicht gestartet werden. Status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Device.c:436 -#, fuzzy, c-format -msgid "Failed to connect, status: 0x%08lX" -msgstr "Kann nicht verbinden. Status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Device.c:513 -#, fuzzy, c-format -msgid "Failed to add service, status: 0x%08lX" -msgstr "Kann advertisement nicht stoppen. Status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Device.c:531 -#, fuzzy, c-format -msgid "Failed to start advertisment, status: 0x%08lX" +msgid "Failed to start advertising, err 0x%04x" msgstr "Kann advertisement nicht starten. Status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:549 +#: ports/nrf/common-hal/bleio/Broadcaster.c:96 +#: ports/nrf/common-hal/bleio/Peripheral.c:336 #, fuzzy, c-format -msgid "Failed to stop advertisment, status: 0x%08lX" +msgid "Failed to stop advertising, err 0x%04x" msgstr "Kann advertisement nicht stoppen. Status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:575 -#: ports/nrf/common-hal/bleio/Scanner.c:103 +#: ports/nrf/common-hal/bleio/Characteristic.c:59 #, fuzzy, c-format -msgid "Failed to start scanning, status: 0x%0xlX" -msgstr "Der Scanvorgang kann nicht gestartet werden. Status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Device.c:592 -#, fuzzy, c-format -msgid "Failed to create mutex, status: 0x%0xlX" +msgid "Failed to read CCCD value, err 0x%04x" msgstr "Kann den Attributwert nicht lesen. Status: 0x%02x" -#: ports/nrf/common-hal/bleio/Service.c:83 -#, c-format -msgid "Failed to add characteristic, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Characteristic.c:89 +#, fuzzy, c-format +msgid "Failed to read gatts value, err 0x%04x" +msgstr "Kann den Attributwert nicht schreiben. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:106 +#, fuzzy, c-format +msgid "Failed to write gatts value, err 0x%04x" +msgstr "Kann den Attributwert nicht schreiben. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:132 +#, fuzzy, c-format +msgid "Failed to notify or indicate attribute value, err %0x04x" +msgstr "Kann den Attributwert nicht mitteilen. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:144 +#, fuzzy, c-format +msgid "Failed to read attribute value, err %0x04x" +msgstr "Kann den Attributwert nicht lesen. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:172 +#, fuzzy, c-format +msgid "Failed to acquire mutex, err 0x%04x" +msgstr "Kann den Attributwert nicht lesen. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:178 +#, fuzzy, c-format +msgid "Failed to write attribute value, err 0x%04x" +msgstr "Kann den Attributwert nicht schreiben. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:189 +#, fuzzy, c-format +msgid "Failed to release mutex, err 0x%04x" +msgstr "Kann den Attributwert nicht lesen. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:251 +#: ports/nrf/common-hal/bleio/Characteristic.c:284 +msgid "bad GATT role" msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:97 +#: ports/nrf/common-hal/bleio/Device.c:80 +#: ports/nrf/common-hal/bleio/Device.c:112 +#, fuzzy +msgid "Data too large for the advertisement packet" +msgstr "Daten können nicht in das advertisement packet eingefügt werden." + +#: ports/nrf/common-hal/bleio/Device.c:262 +#, fuzzy +msgid "Failed to discover services" +msgstr "Kann advertisement nicht stoppen. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:267 +#: ports/nrf/common-hal/bleio/Device.c:300 +#, fuzzy +msgid "Failed to acquire mutex" +msgstr "Konnte keinen RX Buffer allozieren" + +#: ports/nrf/common-hal/bleio/Device.c:278 +#: ports/nrf/common-hal/bleio/Device.c:311 +#: ports/nrf/common-hal/bleio/Device.c:342 +#: ports/nrf/common-hal/bleio/Device.c:376 +#, fuzzy +msgid "Failed to release mutex" +msgstr "Kann den Attributwert nicht lesen. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:387 +#, fuzzy +msgid "Failed to continue scanning" +msgstr "Der Scanvorgang kann nicht gestartet werden. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:419 +#, fuzzy +msgid "Failed to connect:" +msgstr "Kann nicht verbinden. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:489 +#, fuzzy +msgid "Failed to add service" +msgstr "Kann advertisement nicht stoppen. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:506 +#, fuzzy +msgid "Failed to start advertising" +msgstr "Kann advertisement nicht starten. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:523 +#, fuzzy +msgid "Failed to stop advertising" +msgstr "Kann advertisement nicht stoppen. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:548 +#, fuzzy +msgid "Failed to start scanning" +msgstr "Der Scanvorgang kann nicht gestartet werden. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:564 +#, fuzzy +msgid "Failed to create mutex" +msgstr "Kann den Attributwert nicht lesen. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Peripheral.c:304 #, fuzzy, c-format -msgid "Failed to add Vendor Specific UUID, status: 0x%08lX" +msgid "Failed to add service, err 0x%04x" +msgstr "Kann advertisement nicht stoppen. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Scanner.c:75 +#, fuzzy, c-format +msgid "Failed to continue scanning, err 0x%04x" +msgstr "Der Scanvorgang kann nicht gestartet werden. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Scanner.c:101 +#, fuzzy, c-format +msgid "Failed to start scanning, err 0x%04x" +msgstr "Der Scanvorgang kann nicht gestartet werden. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Service.c:88 +#, fuzzy, c-format +msgid "Failed to add characteristic, err 0x%04x" +msgstr "Kann advertisement nicht stoppen. Status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Service.c:92 +msgid "Characteristic already in use by another Service." +msgstr "" + +#: ports/nrf/common-hal/bleio/UUID.c:54 +#, fuzzy, c-format +msgid "Failed to register Vendor-Specific UUID, err 0x%04x" msgstr "Kann keine herstellerspezifische 128-Bit-UUID hinzufügen." -#: ports/nrf/common-hal/bleio/UUID.c:102 -msgid "Invalid UUID string length" -msgstr "Ungültige UUID-Stringlänge" +#: ports/nrf/common-hal/bleio/UUID.c:73 +#, c-format +msgid "Could not decode ble_uuid, err 0x%04x" +msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:109 -#: shared-bindings/bleio/Characteristic.c:125 -#: shared-bindings/bleio/Service.c:105 -msgid "Invalid UUID parameter" -msgstr "Ungültiger UUID-Parameter" +#: ports/nrf/common-hal/bleio/UUID.c:88 +msgid "Unexpected nrfx uuid type" +msgstr "" #: ports/nrf/common-hal/busio/I2C.c:98 #, fuzzy @@ -807,10 +870,10 @@ msgstr "bytes mit merh als 8 bits werden nicht unterstützt" msgid "busio.UART not available" msgstr "" -#: ports/nrf/common-hal/microcontroller/Processor.c:49 -#, c-format -msgid "Can not get temperature. status: 0x%02x" -msgstr "" +#: ports/nrf/common-hal/microcontroller/Processor.c:48 +#, fuzzy +msgid "Cannot get temperature" +msgstr "Kann PPCP Parameter nicht setzen." #: ports/nrf/common-hal/pulseio/PWMOut.c:161 #, fuzzy @@ -1944,7 +2007,7 @@ msgstr "" msgid "memory allocation failed, allocating %u bytes" msgstr "" -#: py/runtime.c:1609 +#: py/runtime.c:1620 msgid "maximum recursion depth exceeded" msgstr "" @@ -2097,14 +2160,31 @@ msgstr "" msgid "buffer slices must be of equal length" msgstr "" -#: shared-bindings/bleio/Address.c:101 -msgid "Wrong address length" +#: shared-bindings/bleio/Address.c:119 +#, c-format +msgid "Address is not %d bytes long or is in wrong format" msgstr "" -#: shared-bindings/bleio/Address.c:107 -msgid "Wrong number of bytes provided" +#: shared-bindings/bleio/Address.c:126 +#, fuzzy, c-format +msgid "Address must be %d bytes long" +msgstr "Buffer müssen gleich lang sein" + +#: shared-bindings/bleio/Characteristic.c:81 +#: shared-bindings/bleio/Descriptor.c:93 shared-bindings/bleio/Service.c:78 +msgid "Expected a UUID" msgstr "" +#: shared-bindings/bleio/CharacteristicBuffer.c:68 +#, fuzzy +msgid "buffer_size must be >= 1" +msgstr "Buffer müssen gleich lang sein" + +#: shared-bindings/bleio/CharacteristicBuffer.c:72 +#, fuzzy +msgid "Expected a Characteristic" +msgstr "Kann das Merkmal nicht hinzufügen." + #: shared-bindings/bleio/Device.c:210 msgid "Can't add services in Central mode" msgstr "" @@ -2121,6 +2201,40 @@ msgstr "" msgid "Can't advertise in Central mode" msgstr "" +#: shared-bindings/bleio/Peripheral.c:111 +msgid "services includes an object that is not a Service" +msgstr "" + +#: shared-bindings/bleio/Peripheral.c:124 +#, fuzzy +msgid "name must be a string" +msgstr "heap muss eine Liste sein" + +#: shared-bindings/bleio/Service.c:90 +msgid "characteristics includes an object that is not a Characteristic" +msgstr "" + +#: shared-bindings/bleio/Service.c:96 +msgid "Characteristic UUID doesn't match Service UUID" +msgstr "" + +#: shared-bindings/bleio/UUID.c:66 +msgid "UUID integer value not in range 0 to 0xffff" +msgstr "" + +#: shared-bindings/bleio/UUID.c:75 +msgid "UUID value is not int or byte buffer" +msgstr "" + +#: shared-bindings/bleio/UUID.c:79 +#, fuzzy +msgid "Byte buffer must be 16 bytes." +msgstr "Buffer müssen gleich lang sein" + +#: shared-bindings/bleio/UUID.c:120 +msgid "not a 128-bit UUID" +msgstr "" + #: shared-bindings/busio/I2C.c:120 msgid "Function requires lock." msgstr "" @@ -2571,6 +2685,12 @@ msgid "" "exit safe mode.\n" msgstr "" +#~ msgid "Invalid UUID string length" +#~ msgstr "Ungültige UUID-Stringlänge" + +#~ msgid "Invalid UUID parameter" +#~ msgstr "Ungültiger UUID-Parameter" + #~ msgid "Invalid Service type" #~ msgstr "Ungültiger Diensttyp" @@ -2591,9 +2711,6 @@ msgstr "" #~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n" #~ msgstr "CircuitPython ist abgestürzt. Ups!\n" -#~ msgid "Cannot set PPCP parameters." -#~ msgstr "Kann PPCP Parameter nicht setzen." - #~ msgid "Cannot apply GAP parameters." #~ msgstr "Kann GAP Parameter nicht anwenden." diff --git a/locale/en_US.po b/locale/en_US.po index 1b3707917b..ee47b08eab 100644 --- a/locale/en_US.po +++ b/locale/en_US.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-10 11:05-0800\n" +"POT-Creation-Date: 2019-01-10 21:31-0500\n" "PO-Revision-Date: 2018-07-27 11:55-0700\n" "Last-Translator: \n" "Language-Team: \n" @@ -400,17 +400,20 @@ msgstr "" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:118 #: ports/esp8266/common-hal/pulseio/PulseIn.c:86 +#: ports/nrf/common-hal/pulseio/PulseIn.c:129 #, c-format msgid "Failed to allocate RX buffer of %d bytes" msgstr "" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:205 #: ports/esp8266/common-hal/pulseio/PulseIn.c:151 +#: ports/nrf/common-hal/pulseio/PulseIn.c:254 msgid "pop from an empty PulseIn" msgstr "" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422 +#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 +#: ports/nrf/common-hal/pulseio/PulseIn.c:241 py/obj.c:422 msgid "index out of range" msgstr "" @@ -648,122 +651,169 @@ msgstr "" msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:125 +#: ports/nrf/common-hal/bleio/Adapter.c:110 +msgid "Failed to change softdevice state" +msgstr "" + +#: ports/nrf/common-hal/bleio/Adapter.c:119 +msgid "Failed to get softdevice state" +msgstr "" + +#: ports/nrf/common-hal/bleio/Adapter.c:138 +msgid "Failed to get local address" +msgstr "" + +#: ports/nrf/common-hal/bleio/Broadcaster.c:48 +msgid "interval not in range 0.0020 to 10.24" +msgstr "" + +#: ports/nrf/common-hal/bleio/Broadcaster.c:58 +#: ports/nrf/common-hal/bleio/Peripheral.c:56 +msgid "Data too large for advertisement packet" +msgstr "" + +#: ports/nrf/common-hal/bleio/Broadcaster.c:83 +#: ports/nrf/common-hal/bleio/Peripheral.c:324 #, c-format -msgid "Failed to change softdevice state, error: 0x%08lX" +msgid "Failed to start advertising, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:135 +#: ports/nrf/common-hal/bleio/Broadcaster.c:96 +#: ports/nrf/common-hal/bleio/Peripheral.c:336 #, c-format -msgid "Failed to get softdevice state, error: 0x%08lX" +msgid "Failed to stop advertising, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:155 +#: ports/nrf/common-hal/bleio/Characteristic.c:59 #, c-format -msgid "Failed to get local address, error: 0x%08lX" +msgid "Failed to read CCCD value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:52 +#: ports/nrf/common-hal/bleio/Characteristic.c:89 #, c-format -msgid "Failed to write gatts value, status: 0x%08lX" +msgid "Failed to read gatts value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:76 +#: ports/nrf/common-hal/bleio/Characteristic.c:106 #, c-format -msgid "Failed to notify attribute value, status: 0x%08lX" +msgid "Failed to write gatts value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:91 +#: ports/nrf/common-hal/bleio/Characteristic.c:132 #, c-format -msgid "Failed to read attribute value, status: 0x%08lX" +msgid "Failed to notify or indicate attribute value, err %0x04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:119 -#: ports/nrf/common-hal/bleio/Device.c:272 -#: ports/nrf/common-hal/bleio/Device.c:307 +#: ports/nrf/common-hal/bleio/Characteristic.c:144 #, c-format -msgid "Failed to acquire mutex, status: 0x%08lX" +msgid "Failed to read attribute value, err %0x04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:126 +#: ports/nrf/common-hal/bleio/Characteristic.c:172 #, c-format -msgid "Failed to write attribute value, status: 0x%08lX" +msgid "Failed to acquire mutex, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:138 -#: ports/nrf/common-hal/bleio/Device.c:284 -#: ports/nrf/common-hal/bleio/Device.c:319 -#: ports/nrf/common-hal/bleio/Device.c:354 -#: ports/nrf/common-hal/bleio/Device.c:391 +#: ports/nrf/common-hal/bleio/Characteristic.c:178 #, c-format -msgid "Failed to release mutex, status: 0x%08lX" +msgid "Failed to write attribute value, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:81 -#: ports/nrf/common-hal/bleio/Device.c:114 -msgid "Can not fit data into the advertisment packet" -msgstr "" - -#: ports/nrf/common-hal/bleio/Device.c:266 +#: ports/nrf/common-hal/bleio/Characteristic.c:189 #, c-format -msgid "Failed to discover serivices, status: 0x%08lX" +msgid "Failed to release mutex, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:403 -#: ports/nrf/common-hal/bleio/Scanner.c:76 +#: ports/nrf/common-hal/bleio/Characteristic.c:251 +#: ports/nrf/common-hal/bleio/Characteristic.c:284 +msgid "bad GATT role" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:80 +#: ports/nrf/common-hal/bleio/Device.c:112 +msgid "Data too large for the advertisement packet" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:262 +msgid "Failed to discover services" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:267 +#: ports/nrf/common-hal/bleio/Device.c:300 +msgid "Failed to acquire mutex" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:278 +#: ports/nrf/common-hal/bleio/Device.c:311 +#: ports/nrf/common-hal/bleio/Device.c:342 +#: ports/nrf/common-hal/bleio/Device.c:376 +msgid "Failed to release mutex" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:387 +msgid "Failed to continue scanning" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:419 +msgid "Failed to connect:" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:489 +msgid "Failed to add service" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:506 +msgid "Failed to start advertising" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:523 +msgid "Failed to stop advertising" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:548 +msgid "Failed to start scanning" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:564 +msgid "Failed to create mutex" +msgstr "" + +#: ports/nrf/common-hal/bleio/Peripheral.c:304 #, c-format -msgid "Failed to continue scanning, status: 0x%0xlX" +msgid "Failed to add service, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:436 +#: ports/nrf/common-hal/bleio/Scanner.c:75 #, c-format -msgid "Failed to connect, status: 0x%08lX" +msgid "Failed to continue scanning, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:513 +#: ports/nrf/common-hal/bleio/Scanner.c:101 #, c-format -msgid "Failed to add service, status: 0x%08lX" +msgid "Failed to start scanning, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:531 +#: ports/nrf/common-hal/bleio/Service.c:88 #, c-format -msgid "Failed to start advertisment, status: 0x%08lX" +msgid "Failed to add characteristic, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:549 +#: ports/nrf/common-hal/bleio/Service.c:92 +msgid "Characteristic already in use by another Service." +msgstr "" + +#: ports/nrf/common-hal/bleio/UUID.c:54 #, c-format -msgid "Failed to stop advertisment, status: 0x%08lX" +msgid "Failed to register Vendor-Specific UUID, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:575 -#: ports/nrf/common-hal/bleio/Scanner.c:103 +#: ports/nrf/common-hal/bleio/UUID.c:73 #, c-format -msgid "Failed to start scanning, status: 0x%0xlX" +msgid "Could not decode ble_uuid, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:592 -#, c-format -msgid "Failed to create mutex, status: 0x%0xlX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Service.c:83 -#, c-format -msgid "Failed to add characteristic, status: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/UUID.c:97 -#, c-format -msgid "Failed to add Vendor Specific UUID, status: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/UUID.c:102 -msgid "Invalid UUID string length" -msgstr "" - -#: ports/nrf/common-hal/bleio/UUID.c:109 -#: shared-bindings/bleio/Characteristic.c:125 -#: shared-bindings/bleio/Service.c:105 -msgid "Invalid UUID parameter" +#: ports/nrf/common-hal/bleio/UUID.c:88 +msgid "Unexpected nrfx uuid type" msgstr "" #: ports/nrf/common-hal/busio/I2C.c:98 @@ -795,9 +845,8 @@ msgstr "" msgid "busio.UART not available" msgstr "" -#: ports/nrf/common-hal/microcontroller/Processor.c:49 -#, c-format -msgid "Can not get temperature. status: 0x%02x" +#: ports/nrf/common-hal/microcontroller/Processor.c:48 +msgid "Cannot get temperature" msgstr "" #: ports/nrf/common-hal/pulseio/PWMOut.c:161 @@ -1929,7 +1978,7 @@ msgstr "" msgid "memory allocation failed, allocating %u bytes" msgstr "" -#: py/runtime.c:1609 +#: py/runtime.c:1620 msgid "maximum recursion depth exceeded" msgstr "" @@ -2079,12 +2128,27 @@ msgstr "" msgid "buffer slices must be of equal length" msgstr "" -#: shared-bindings/bleio/Address.c:101 -msgid "Wrong address length" +#: shared-bindings/bleio/Address.c:119 +#, c-format +msgid "Address is not %d bytes long or is in wrong format" msgstr "" -#: shared-bindings/bleio/Address.c:107 -msgid "Wrong number of bytes provided" +#: shared-bindings/bleio/Address.c:126 +#, c-format +msgid "Address must be %d bytes long" +msgstr "" + +#: shared-bindings/bleio/Characteristic.c:81 +#: shared-bindings/bleio/Descriptor.c:93 shared-bindings/bleio/Service.c:78 +msgid "Expected a UUID" +msgstr "" + +#: shared-bindings/bleio/CharacteristicBuffer.c:68 +msgid "buffer_size must be >= 1" +msgstr "" + +#: shared-bindings/bleio/CharacteristicBuffer.c:72 +msgid "Expected a Characteristic" msgstr "" #: shared-bindings/bleio/Device.c:210 @@ -2103,6 +2167,38 @@ msgstr "" msgid "Can't advertise in Central mode" msgstr "" +#: shared-bindings/bleio/Peripheral.c:111 +msgid "services includes an object that is not a Service" +msgstr "" + +#: shared-bindings/bleio/Peripheral.c:124 +msgid "name must be a string" +msgstr "" + +#: shared-bindings/bleio/Service.c:90 +msgid "characteristics includes an object that is not a Characteristic" +msgstr "" + +#: shared-bindings/bleio/Service.c:96 +msgid "Characteristic UUID doesn't match Service UUID" +msgstr "" + +#: shared-bindings/bleio/UUID.c:66 +msgid "UUID integer value not in range 0 to 0xffff" +msgstr "" + +#: shared-bindings/bleio/UUID.c:75 +msgid "UUID value is not int or byte buffer" +msgstr "" + +#: shared-bindings/bleio/UUID.c:79 +msgid "Byte buffer must be 16 bytes." +msgstr "" + +#: shared-bindings/bleio/UUID.c:120 +msgid "not a 128-bit UUID" +msgstr "" + #: shared-bindings/busio/I2C.c:120 msgid "Function requires lock." msgstr "" diff --git a/locale/es.po b/locale/es.po index 3970567971..11827e0b62 100644 --- a/locale/es.po +++ b/locale/es.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-10 11:05-0800\n" +"POT-Creation-Date: 2019-01-10 21:32-0500\n" "PO-Revision-Date: 2018-08-24 22:56-0500\n" "Last-Translator: \n" "Language-Team: \n" @@ -406,17 +406,20 @@ msgstr "El canal EXTINT ya está siendo utilizado" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:118 #: ports/esp8266/common-hal/pulseio/PulseIn.c:86 +#: ports/nrf/common-hal/pulseio/PulseIn.c:129 #, c-format msgid "Failed to allocate RX buffer of %d bytes" msgstr "Falló la asignación del buffer RX de %d bytes" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:205 #: ports/esp8266/common-hal/pulseio/PulseIn.c:151 +#: ports/nrf/common-hal/pulseio/PulseIn.c:254 msgid "pop from an empty PulseIn" msgstr "pop de un PulseIn vacío" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422 +#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 +#: ports/nrf/common-hal/pulseio/PulseIn.c:241 py/obj.c:422 msgid "index out of range" msgstr "index fuera de rango" @@ -655,124 +658,185 @@ msgstr "Funcionalidad AnalogOut no soportada" msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:125 -#, c-format -msgid "Failed to change softdevice state, error: 0x%08lX" +#: ports/nrf/common-hal/bleio/Adapter.c:110 +#, fuzzy +msgid "Failed to change softdevice state" msgstr "No se puede cambiar el estado del softdevice, error: 0x%08lX" -#: ports/nrf/common-hal/bleio/Adapter.c:135 -#, c-format -msgid "Failed to get softdevice state, error: 0x%08lX" +#: ports/nrf/common-hal/bleio/Adapter.c:119 +#, fuzzy +msgid "Failed to get softdevice state" msgstr "No se puede obtener el estado del softdevice, error: 0x%08lX" -#: ports/nrf/common-hal/bleio/Adapter.c:155 -#, c-format -msgid "Failed to get local address, error: 0x%08lX" +#: ports/nrf/common-hal/bleio/Adapter.c:138 +#, fuzzy +msgid "Failed to get local address" msgstr "No se puede obtener la dirección local, error: 0x%08lX" -#: ports/nrf/common-hal/bleio/Characteristic.c:52 -#, fuzzy, c-format -msgid "Failed to write gatts value, status: 0x%08lX" -msgstr "No se puede escribir el valor del atributo. status: 0x%02x" +#: ports/nrf/common-hal/bleio/Broadcaster.c:48 +msgid "interval not in range 0.0020 to 10.24" +msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:76 -#, fuzzy, c-format -msgid "Failed to notify attribute value, status: 0x%08lX" -msgstr "No se puede notificar el valor del anuncio. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Characteristic.c:91 -#, fuzzy, c-format -msgid "Failed to read attribute value, status: 0x%08lX" -msgstr "No se puede leer el valor del atributo. status 0x%02x" - -#: ports/nrf/common-hal/bleio/Characteristic.c:119 -#: ports/nrf/common-hal/bleio/Device.c:272 -#: ports/nrf/common-hal/bleio/Device.c:307 -#, c-format -msgid "Failed to acquire mutex, status: 0x%08lX" -msgstr "No se puede adquirir el mutex, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Characteristic.c:126 -#, fuzzy, c-format -msgid "Failed to write attribute value, status: 0x%08lX" -msgstr "No se puede escribir el valor del atributo. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Characteristic.c:138 -#: ports/nrf/common-hal/bleio/Device.c:284 -#: ports/nrf/common-hal/bleio/Device.c:319 -#: ports/nrf/common-hal/bleio/Device.c:354 -#: ports/nrf/common-hal/bleio/Device.c:391 -#, c-format -msgid "Failed to release mutex, status: 0x%08lX" -msgstr "No se puede liberar el mutex, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Device.c:81 -#: ports/nrf/common-hal/bleio/Device.c:114 +#: ports/nrf/common-hal/bleio/Broadcaster.c:58 +#: ports/nrf/common-hal/bleio/Peripheral.c:56 #, fuzzy -msgid "Can not fit data into the advertisment packet" +msgid "Data too large for advertisement packet" msgstr "Los datos no caben en el paquete de anuncio." -#: ports/nrf/common-hal/bleio/Device.c:266 -#, c-format -msgid "Failed to discover serivices, status: 0x%08lX" -msgstr "No se puede descubrir servicios, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Device.c:403 -#: ports/nrf/common-hal/bleio/Scanner.c:76 +#: ports/nrf/common-hal/bleio/Broadcaster.c:83 +#: ports/nrf/common-hal/bleio/Peripheral.c:324 #, fuzzy, c-format -msgid "Failed to continue scanning, status: 0x%0xlX" -msgstr "No se puede iniciar el escaneo. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Device.c:436 -#, fuzzy, c-format -msgid "Failed to connect, status: 0x%08lX" -msgstr "No se puede conectar. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Device.c:513 -#, fuzzy, c-format -msgid "Failed to add service, status: 0x%08lX" -msgstr "No se puede detener el anuncio. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Device.c:531 -#, fuzzy, c-format -msgid "Failed to start advertisment, status: 0x%08lX" +msgid "Failed to start advertising, err 0x%04x" msgstr "No se puede inicar el anuncio. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:549 +#: ports/nrf/common-hal/bleio/Broadcaster.c:96 +#: ports/nrf/common-hal/bleio/Peripheral.c:336 #, fuzzy, c-format -msgid "Failed to stop advertisment, status: 0x%08lX" +msgid "Failed to stop advertising, err 0x%04x" msgstr "No se puede detener el anuncio. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:575 -#: ports/nrf/common-hal/bleio/Scanner.c:103 +#: ports/nrf/common-hal/bleio/Characteristic.c:59 #, fuzzy, c-format -msgid "Failed to start scanning, status: 0x%0xlX" -msgstr "No se puede iniciar el escaneo. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Device.c:592 -#, fuzzy, c-format -msgid "Failed to create mutex, status: 0x%0xlX" +msgid "Failed to read CCCD value, err 0x%04x" msgstr "No se puede leer el valor del atributo. status 0x%02x" -#: ports/nrf/common-hal/bleio/Service.c:83 -#, c-format -msgid "Failed to add characteristic, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Characteristic.c:89 +#, fuzzy, c-format +msgid "Failed to read gatts value, err 0x%04x" +msgstr "No se puede escribir el valor del atributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:106 +#, fuzzy, c-format +msgid "Failed to write gatts value, err 0x%04x" +msgstr "No se puede escribir el valor del atributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:132 +#, fuzzy, c-format +msgid "Failed to notify or indicate attribute value, err %0x04x" +msgstr "No se puede notificar el valor del anuncio. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:144 +#, fuzzy, c-format +msgid "Failed to read attribute value, err %0x04x" +msgstr "No se puede leer el valor del atributo. status 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:172 +#, fuzzy, c-format +msgid "Failed to acquire mutex, err 0x%04x" +msgstr "No se puede adquirir el mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:178 +#, fuzzy, c-format +msgid "Failed to write attribute value, err 0x%04x" +msgstr "No se puede escribir el valor del atributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:189 +#, fuzzy, c-format +msgid "Failed to release mutex, err 0x%04x" +msgstr "No se puede liberar el mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:251 +#: ports/nrf/common-hal/bleio/Characteristic.c:284 +msgid "bad GATT role" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:80 +#: ports/nrf/common-hal/bleio/Device.c:112 +#, fuzzy +msgid "Data too large for the advertisement packet" +msgstr "Los datos no caben en el paquete de anuncio." + +#: ports/nrf/common-hal/bleio/Device.c:262 +#, fuzzy +msgid "Failed to discover services" +msgstr "No se puede descubrir servicios, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:267 +#: ports/nrf/common-hal/bleio/Device.c:300 +#, fuzzy +msgid "Failed to acquire mutex" +msgstr "No se puede adquirir el mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:278 +#: ports/nrf/common-hal/bleio/Device.c:311 +#: ports/nrf/common-hal/bleio/Device.c:342 +#: ports/nrf/common-hal/bleio/Device.c:376 +#, fuzzy +msgid "Failed to release mutex" +msgstr "No se puede liberar el mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:387 +#, fuzzy +msgid "Failed to continue scanning" +msgstr "No se puede iniciar el escaneo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:419 +#, fuzzy +msgid "Failed to connect:" +msgstr "No se puede conectar. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:489 +#, fuzzy +msgid "Failed to add service" +msgstr "No se puede detener el anuncio. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:506 +#, fuzzy +msgid "Failed to start advertising" +msgstr "No se puede inicar el anuncio. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:523 +#, fuzzy +msgid "Failed to stop advertising" +msgstr "No se puede detener el anuncio. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:548 +#, fuzzy +msgid "Failed to start scanning" +msgstr "No se puede iniciar el escaneo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:564 +#, fuzzy +msgid "Failed to create mutex" +msgstr "No se puede leer el valor del atributo. status 0x%02x" + +#: ports/nrf/common-hal/bleio/Peripheral.c:304 +#, fuzzy, c-format +msgid "Failed to add service, err 0x%04x" +msgstr "No se puede detener el anuncio. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Scanner.c:75 +#, fuzzy, c-format +msgid "Failed to continue scanning, err 0x%04x" +msgstr "No se puede iniciar el escaneo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Scanner.c:101 +#, fuzzy, c-format +msgid "Failed to start scanning, err 0x%04x" +msgstr "No se puede iniciar el escaneo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Service.c:88 +#, fuzzy, c-format +msgid "Failed to add characteristic, err 0x%04x" msgstr "No se puede añadir caracteristica, status: 0x%08lX" -#: ports/nrf/common-hal/bleio/UUID.c:97 +#: ports/nrf/common-hal/bleio/Service.c:92 +msgid "Characteristic already in use by another Service." +msgstr "" + +#: ports/nrf/common-hal/bleio/UUID.c:54 #, fuzzy, c-format -msgid "Failed to add Vendor Specific UUID, status: 0x%08lX" +msgid "Failed to register Vendor-Specific UUID, err 0x%04x" msgstr "No se puede agregar el Vendor Specific 128-bit UUID." -#: ports/nrf/common-hal/bleio/UUID.c:102 -msgid "Invalid UUID string length" -msgstr "Longitud de string UUID inválida" +#: ports/nrf/common-hal/bleio/UUID.c:73 +#, c-format +msgid "Could not decode ble_uuid, err 0x%04x" +msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:109 -#: shared-bindings/bleio/Characteristic.c:125 -#: shared-bindings/bleio/Service.c:105 -msgid "Invalid UUID parameter" -msgstr "Parámetro UUID inválido" +#: ports/nrf/common-hal/bleio/UUID.c:88 +msgid "Unexpected nrfx uuid type" +msgstr "" #: ports/nrf/common-hal/busio/I2C.c:98 msgid "All I2C peripherals are in use" @@ -803,9 +867,9 @@ msgstr "Paridad impar no soportada" msgid "busio.UART not available" msgstr "busio.UART no disponible" -#: ports/nrf/common-hal/microcontroller/Processor.c:49 -#, c-format -msgid "Can not get temperature. status: 0x%02x" +#: ports/nrf/common-hal/microcontroller/Processor.c:48 +#, fuzzy +msgid "Cannot get temperature" msgstr "No se puede obtener la temperatura. status: 0x%02x" #: ports/nrf/common-hal/pulseio/PWMOut.c:161 @@ -1955,7 +2019,7 @@ msgstr "la asignación de memoria falló, el heap está bloqueado" msgid "memory allocation failed, allocating %u bytes" msgstr "la asignación de memoria falló, asignando %u bytes" -#: py/runtime.c:1609 +#: py/runtime.c:1620 msgid "maximum recursion depth exceeded" msgstr "profundidad máxima de recursión excedida" @@ -2109,13 +2173,31 @@ msgstr "Numero inválido de bits" msgid "buffer slices must be of equal length" msgstr "" -#: shared-bindings/bleio/Address.c:101 -msgid "Wrong address length" -msgstr "Longitud de address erronea" +#: shared-bindings/bleio/Address.c:119 +#, c-format +msgid "Address is not %d bytes long or is in wrong format" +msgstr "" -#: shared-bindings/bleio/Address.c:107 -msgid "Wrong number of bytes provided" -msgstr "Numero erroneo de bytes dados" +#: shared-bindings/bleio/Address.c:126 +#, fuzzy, c-format +msgid "Address must be %d bytes long" +msgstr "palette debe ser 32 bytes de largo" + +#: shared-bindings/bleio/Characteristic.c:81 +#: shared-bindings/bleio/Descriptor.c:93 shared-bindings/bleio/Service.c:78 +#, fuzzy +msgid "Expected a UUID" +msgstr "Se espera un %q" + +#: shared-bindings/bleio/CharacteristicBuffer.c:68 +#, fuzzy +msgid "buffer_size must be >= 1" +msgstr "los buffers deben de tener la misma longitud" + +#: shared-bindings/bleio/CharacteristicBuffer.c:72 +#, fuzzy +msgid "Expected a Characteristic" +msgstr "No se puede agregar la Característica." #: shared-bindings/bleio/Device.c:210 msgid "Can't add services in Central mode" @@ -2133,6 +2215,40 @@ msgstr "No se puede cambiar el nombre en modo Central" msgid "Can't advertise in Central mode" msgstr "" +#: shared-bindings/bleio/Peripheral.c:111 +msgid "services includes an object that is not a Service" +msgstr "" + +#: shared-bindings/bleio/Peripheral.c:124 +#, fuzzy +msgid "name must be a string" +msgstr "palabras clave deben ser strings" + +#: shared-bindings/bleio/Service.c:90 +msgid "characteristics includes an object that is not a Characteristic" +msgstr "" + +#: shared-bindings/bleio/Service.c:96 +msgid "Characteristic UUID doesn't match Service UUID" +msgstr "" + +#: shared-bindings/bleio/UUID.c:66 +msgid "UUID integer value not in range 0 to 0xffff" +msgstr "" + +#: shared-bindings/bleio/UUID.c:75 +msgid "UUID value is not int or byte buffer" +msgstr "" + +#: shared-bindings/bleio/UUID.c:79 +#, fuzzy +msgid "Byte buffer must be 16 bytes." +msgstr "buffer debe de ser un objeto bytes-like" + +#: shared-bindings/bleio/UUID.c:120 +msgid "not a 128-bit UUID" +msgstr "" + #: shared-bindings/busio/I2C.c:120 msgid "Function requires lock." msgstr "La función requiere lock" @@ -2585,8 +2701,17 @@ msgid "" "exit safe mode.\n" msgstr "" -#~ msgid "Can not add Characteristic." -#~ msgstr "No se puede agregar la Característica." +#~ msgid "Invalid UUID string length" +#~ msgstr "Longitud de string UUID inválida" + +#~ msgid "Invalid UUID parameter" +#~ msgstr "Parámetro UUID inválido" + +#~ msgid "Wrong address length" +#~ msgstr "Longitud de address erronea" + +#~ msgid "Wrong number of bytes provided" +#~ msgstr "Numero erroneo de bytes dados" #~ msgid "Cannot apply GAP parameters." #~ msgstr "No se pueden aplicar los parámetros GAP." diff --git a/locale/fil.po b/locale/fil.po index 0755ad8a7a..5daa673f70 100644 --- a/locale/fil.po +++ b/locale/fil.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-10 11:05-0800\n" +"POT-Creation-Date: 2019-01-10 21:32-0500\n" "PO-Revision-Date: 2018-12-20 22:15-0800\n" "Last-Translator: Timothy \n" "Language-Team: fil\n" @@ -404,17 +404,20 @@ msgstr "Ginagamit na ang EXTINT channel" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:118 #: ports/esp8266/common-hal/pulseio/PulseIn.c:86 +#: ports/nrf/common-hal/pulseio/PulseIn.c:129 #, c-format msgid "Failed to allocate RX buffer of %d bytes" msgstr "Nabigong ilaan ang RX buffer ng %d bytes" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:205 #: ports/esp8266/common-hal/pulseio/PulseIn.c:151 +#: ports/nrf/common-hal/pulseio/PulseIn.c:254 msgid "pop from an empty PulseIn" msgstr "pop mula sa walang laman na PulseIn" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422 +#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 +#: ports/nrf/common-hal/pulseio/PulseIn.c:241 py/obj.c:422 msgid "index out of range" msgstr "index wala sa sakop" @@ -655,123 +658,186 @@ msgstr "Hindi supportado ang AnalogOut" msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" msgstr "Soft device assert, id: 0x%08lX, pc: 0x%08lX" -#: ports/nrf/common-hal/bleio/Adapter.c:125 -#, c-format -msgid "Failed to change softdevice state, error: 0x%08lX" +#: ports/nrf/common-hal/bleio/Adapter.c:110 +#, fuzzy +msgid "Failed to change softdevice state" msgstr "Nabigo sa pagbago ng softdevice state, error: 0x%08lX" -#: ports/nrf/common-hal/bleio/Adapter.c:135 -#, c-format -msgid "Failed to get softdevice state, error: 0x%08lX" +#: ports/nrf/common-hal/bleio/Adapter.c:119 +#, fuzzy +msgid "Failed to get softdevice state" msgstr "Nabigo sa pagkuha ng softdevice state, error: 0x%08lX" -#: ports/nrf/common-hal/bleio/Adapter.c:155 -#, c-format -msgid "Failed to get local address, error: 0x%08lX" +#: ports/nrf/common-hal/bleio/Adapter.c:138 +#, fuzzy +msgid "Failed to get local address" msgstr "Nabigo sa pagkuha ng local na address, , error: 0x%08lX" -#: ports/nrf/common-hal/bleio/Characteristic.c:52 -#, c-format -msgid "Failed to write gatts value, status: 0x%08lX" -msgstr "Hindi maisulat ang gatts value, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Broadcaster.c:48 +msgid "interval not in range 0.0020 to 10.24" +msgstr "" -#: ports/nrf/common-hal/bleio/Characteristic.c:76 -#, c-format -msgid "Failed to notify attribute value, status: 0x%08lX" -msgstr "Hindi mabalitaan ang attribute value, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Characteristic.c:91 -#, c-format -msgid "Failed to read attribute value, status: 0x%08lX" -msgstr "Hindi mabasa ang value ng attribute, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Characteristic.c:119 -#: ports/nrf/common-hal/bleio/Device.c:272 -#: ports/nrf/common-hal/bleio/Device.c:307 -#, c-format -msgid "Failed to acquire mutex, status: 0x%08lX" -msgstr "Nabigo sa pag kuha ng mutex, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Characteristic.c:126 -#, c-format -msgid "Failed to write attribute value, status: 0x%08lX" -msgstr "Hindi maisulat ang attribute value, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Characteristic.c:138 -#: ports/nrf/common-hal/bleio/Device.c:284 -#: ports/nrf/common-hal/bleio/Device.c:319 -#: ports/nrf/common-hal/bleio/Device.c:354 -#: ports/nrf/common-hal/bleio/Device.c:391 -#, c-format -msgid "Failed to release mutex, status: 0x%08lX" -msgstr "Nabigo sa pagrelease ng mutex, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Device.c:81 -#: ports/nrf/common-hal/bleio/Device.c:114 -msgid "Can not fit data into the advertisment packet" +#: ports/nrf/common-hal/bleio/Broadcaster.c:58 +#: ports/nrf/common-hal/bleio/Peripheral.c:56 +#, fuzzy +msgid "Data too large for advertisement packet" msgstr "Hindi makasya ang data sa loob ng advertisement packet" -#: ports/nrf/common-hal/bleio/Device.c:266 -#, c-format -msgid "Failed to discover serivices, status: 0x%08lX" -msgstr "Nabigo sa pagdiscover ng services, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Device.c:403 -#: ports/nrf/common-hal/bleio/Scanner.c:76 -#, c-format -msgid "Failed to continue scanning, status: 0x%0xlX" -msgstr "Hindi maituloy ang pag scan, status: 0x%0xlX" - -#: ports/nrf/common-hal/bleio/Device.c:436 -#, c-format -msgid "Failed to connect, status: 0x%08lX" -msgstr "Hindi makaconnect, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Device.c:513 -#, c-format -msgid "Failed to add service, status: 0x%08lX" -msgstr "Hindi matagumpay ang paglagay ng service, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Device.c:531 -#, c-format -msgid "Failed to start advertisment, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Broadcaster.c:83 +#: ports/nrf/common-hal/bleio/Peripheral.c:324 +#, fuzzy, c-format +msgid "Failed to start advertising, err 0x%04x" msgstr "Hindi masimulaan ang advertisement, status: 0x%08lX" -#: ports/nrf/common-hal/bleio/Device.c:549 -#, c-format -msgid "Failed to stop advertisment, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Broadcaster.c:96 +#: ports/nrf/common-hal/bleio/Peripheral.c:336 +#, fuzzy, c-format +msgid "Failed to stop advertising, err 0x%04x" msgstr "Hindi mahinto ang advertisement, status: 0x%08lX" -#: ports/nrf/common-hal/bleio/Device.c:575 -#: ports/nrf/common-hal/bleio/Scanner.c:103 -#, c-format -msgid "Failed to start scanning, status: 0x%0xlX" +#: ports/nrf/common-hal/bleio/Characteristic.c:59 +#, fuzzy, c-format +msgid "Failed to read CCCD value, err 0x%04x" +msgstr "Hindi mabasa ang value ng attribute, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:89 +#, fuzzy, c-format +msgid "Failed to read gatts value, err 0x%04x" +msgstr "Hindi maisulat ang gatts value, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:106 +#, fuzzy, c-format +msgid "Failed to write gatts value, err 0x%04x" +msgstr "Hindi maisulat ang gatts value, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:132 +#, fuzzy, c-format +msgid "Failed to notify or indicate attribute value, err %0x04x" +msgstr "Hindi mabalitaan ang attribute value, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:144 +#, fuzzy, c-format +msgid "Failed to read attribute value, err %0x04x" +msgstr "Hindi mabasa ang value ng attribute, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:172 +#, fuzzy, c-format +msgid "Failed to acquire mutex, err 0x%04x" +msgstr "Nabigo sa pag kuha ng mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:178 +#, fuzzy, c-format +msgid "Failed to write attribute value, err 0x%04x" +msgstr "Hindi maisulat ang attribute value, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:189 +#, fuzzy, c-format +msgid "Failed to release mutex, err 0x%04x" +msgstr "Nabigo sa pagrelease ng mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:251 +#: ports/nrf/common-hal/bleio/Characteristic.c:284 +msgid "bad GATT role" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:80 +#: ports/nrf/common-hal/bleio/Device.c:112 +#, fuzzy +msgid "Data too large for the advertisement packet" +msgstr "Hindi makasya ang data sa loob ng advertisement packet" + +#: ports/nrf/common-hal/bleio/Device.c:262 +#, fuzzy +msgid "Failed to discover services" +msgstr "Nabigo sa pagdiscover ng services, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:267 +#: ports/nrf/common-hal/bleio/Device.c:300 +#, fuzzy +msgid "Failed to acquire mutex" +msgstr "Nabigo sa pag kuha ng mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:278 +#: ports/nrf/common-hal/bleio/Device.c:311 +#: ports/nrf/common-hal/bleio/Device.c:342 +#: ports/nrf/common-hal/bleio/Device.c:376 +#, fuzzy +msgid "Failed to release mutex" +msgstr "Nabigo sa pagrelease ng mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:387 +#, fuzzy +msgid "Failed to continue scanning" +msgstr "Hindi maituloy ang pag scan, status: 0x%0xlX" + +#: ports/nrf/common-hal/bleio/Device.c:419 +#, fuzzy +msgid "Failed to connect:" +msgstr "Hindi makaconnect, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:489 +#, fuzzy +msgid "Failed to add service" +msgstr "Hindi matagumpay ang paglagay ng service, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:506 +#, fuzzy +msgid "Failed to start advertising" +msgstr "Hindi masimulaan ang advertisement, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:523 +#, fuzzy +msgid "Failed to stop advertising" +msgstr "Hindi mahinto ang advertisement, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:548 +#, fuzzy +msgid "Failed to start scanning" msgstr "Hindi masimulaan mag i-scan, status: 0x%0xlX" -#: ports/nrf/common-hal/bleio/Device.c:592 -#, c-format -msgid "Failed to create mutex, status: 0x%0xlX" +#: ports/nrf/common-hal/bleio/Device.c:564 +#, fuzzy +msgid "Failed to create mutex" msgstr "Hindi matagumpay ang pagbuo ng mutex, status: 0x%0xlX" -#: ports/nrf/common-hal/bleio/Service.c:83 -#, c-format -msgid "Failed to add characteristic, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Peripheral.c:304 +#, fuzzy, c-format +msgid "Failed to add service, err 0x%04x" +msgstr "Hindi matagumpay ang paglagay ng service, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Scanner.c:75 +#, fuzzy, c-format +msgid "Failed to continue scanning, err 0x%04x" +msgstr "Hindi maituloy ang pag scan, status: 0x%0xlX" + +#: ports/nrf/common-hal/bleio/Scanner.c:101 +#, fuzzy, c-format +msgid "Failed to start scanning, err 0x%04x" +msgstr "Hindi masimulaan mag i-scan, status: 0x%0xlX" + +#: ports/nrf/common-hal/bleio/Service.c:88 +#, fuzzy, c-format +msgid "Failed to add characteristic, err 0x%04x" msgstr "Nabigo sa paglagay ng characteristic, status: 0x%08lX" -#: ports/nrf/common-hal/bleio/UUID.c:97 -#, c-format -msgid "Failed to add Vendor Specific UUID, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Service.c:92 +msgid "Characteristic already in use by another Service." +msgstr "" + +#: ports/nrf/common-hal/bleio/UUID.c:54 +#, fuzzy, c-format +msgid "Failed to register Vendor-Specific UUID, err 0x%04x" msgstr "Hindi matagumpay ang paglagay ng Vender Specific UUID, status: 0x%08lX" -#: ports/nrf/common-hal/bleio/UUID.c:102 -msgid "Invalid UUID string length" -msgstr "Mali ang UUID string length" +#: ports/nrf/common-hal/bleio/UUID.c:73 +#, c-format +msgid "Could not decode ble_uuid, err 0x%04x" +msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:109 -#: shared-bindings/bleio/Characteristic.c:125 -#: shared-bindings/bleio/Service.c:105 -msgid "Invalid UUID parameter" -msgstr "Mali ang UUID parameter" +#: ports/nrf/common-hal/bleio/UUID.c:88 +#, fuzzy +msgid "Unexpected nrfx uuid type" +msgstr "hindi inaasahang indent" #: ports/nrf/common-hal/busio/I2C.c:98 msgid "All I2C peripherals are in use" @@ -802,9 +868,9 @@ msgstr "Odd na parity ay hindi supportado" msgid "busio.UART not available" msgstr "busio.UART hindi available" -#: ports/nrf/common-hal/microcontroller/Processor.c:49 -#, c-format -msgid "Can not get temperature. status: 0x%02x" +#: ports/nrf/common-hal/microcontroller/Processor.c:48 +#, fuzzy +msgid "Cannot get temperature" msgstr "Hindi makuha ang temperatura. status 0x%02x" #: ports/nrf/common-hal/pulseio/PWMOut.c:161 @@ -1958,7 +2024,7 @@ msgstr "abigo ang paglalaan ng memorya, ang heap ay naka-lock" msgid "memory allocation failed, allocating %u bytes" msgstr "nabigo ang paglalaan ng memorya, paglalaan ng %u bytes" -#: py/runtime.c:1609 +#: py/runtime.c:1620 msgid "maximum recursion depth exceeded" msgstr "lumagpas ang maximum recursion depth" @@ -2115,13 +2181,31 @@ msgstr "Mali ang bilang ng bits" msgid "buffer slices must be of equal length" msgstr "aarehas na haba dapat ang buffer slices" -#: shared-bindings/bleio/Address.c:101 -msgid "Wrong address length" -msgstr "Mali ang address length" +#: shared-bindings/bleio/Address.c:119 +#, c-format +msgid "Address is not %d bytes long or is in wrong format" +msgstr "" -#: shared-bindings/bleio/Address.c:107 -msgid "Wrong number of bytes provided" -msgstr "Mali ang bilang ng bytes" +#: shared-bindings/bleio/Address.c:126 +#, fuzzy, c-format +msgid "Address must be %d bytes long" +msgstr "ang palette ay dapat 32 bytes ang haba" + +#: shared-bindings/bleio/Characteristic.c:81 +#: shared-bindings/bleio/Descriptor.c:93 shared-bindings/bleio/Service.c:78 +#, fuzzy +msgid "Expected a UUID" +msgstr "Umasa ng %q" + +#: shared-bindings/bleio/CharacteristicBuffer.c:68 +#, fuzzy +msgid "buffer_size must be >= 1" +msgstr "aarehas na haba dapat ang buffer slices" + +#: shared-bindings/bleio/CharacteristicBuffer.c:72 +#, fuzzy +msgid "Expected a Characteristic" +msgstr "Hindi mabasa and Characteristic." #: shared-bindings/bleio/Device.c:210 msgid "Can't add services in Central mode" @@ -2139,6 +2223,40 @@ msgstr "Hindi mapalitan ang pangalan sa Central mode" msgid "Can't advertise in Central mode" msgstr "Hindi ma advertise habang nasa Central mode" +#: shared-bindings/bleio/Peripheral.c:111 +msgid "services includes an object that is not a Service" +msgstr "" + +#: shared-bindings/bleio/Peripheral.c:124 +#, fuzzy +msgid "name must be a string" +msgstr "ang keywords dapat strings" + +#: shared-bindings/bleio/Service.c:90 +msgid "characteristics includes an object that is not a Characteristic" +msgstr "" + +#: shared-bindings/bleio/Service.c:96 +msgid "Characteristic UUID doesn't match Service UUID" +msgstr "" + +#: shared-bindings/bleio/UUID.c:66 +msgid "UUID integer value not in range 0 to 0xffff" +msgstr "" + +#: shared-bindings/bleio/UUID.c:75 +msgid "UUID value is not int or byte buffer" +msgstr "" + +#: shared-bindings/bleio/UUID.c:79 +#, fuzzy +msgid "Byte buffer must be 16 bytes." +msgstr "buffer ay dapat bytes-like object" + +#: shared-bindings/bleio/UUID.c:120 +msgid "not a 128-bit UUID" +msgstr "" + #: shared-bindings/busio/I2C.c:120 msgid "Function requires lock." msgstr "Kailangan ng lock ang function." @@ -2600,8 +2718,17 @@ msgstr "" "Ang reset button ay pinindot habang nag boot ang CircuitPython. Pindutin " "ulit para lumabas sa safe mode.\n" -#~ msgid "Can not add Characteristic." -#~ msgstr "Hindi mabasa and Characteristic." +#~ msgid "Invalid UUID string length" +#~ msgstr "Mali ang UUID string length" + +#~ msgid "Invalid UUID parameter" +#~ msgstr "Mali ang UUID parameter" + +#~ msgid "Wrong address length" +#~ msgstr "Mali ang address length" + +#~ msgid "Wrong number of bytes provided" +#~ msgstr "Mali ang bilang ng bytes" #~ msgid "Cannot apply GAP parameters." #~ msgstr "Hindi ma-apply ang GAP parameters." diff --git a/locale/fr.po b/locale/fr.po index 6c41ffaea1..b27cfeb799 100644 --- a/locale/fr.po +++ b/locale/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-10 11:05-0800\n" +"POT-Creation-Date: 2019-01-10 21:32-0500\n" "PO-Revision-Date: 2018-12-23 20:05+0100\n" "Last-Translator: Pierrick Couturier \n" "Language-Team: fr\n" @@ -402,17 +402,20 @@ msgstr "Canal EXTINT déjà utilisé" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:118 #: ports/esp8266/common-hal/pulseio/PulseIn.c:86 +#: ports/nrf/common-hal/pulseio/PulseIn.c:129 #, c-format msgid "Failed to allocate RX buffer of %d bytes" msgstr "Echec de l'allocation de %d octets du tampon RX" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:205 #: ports/esp8266/common-hal/pulseio/PulseIn.c:151 +#: ports/nrf/common-hal/pulseio/PulseIn.c:254 msgid "pop from an empty PulseIn" msgstr "'pop' d'une entrée PulseIn vide" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422 +#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 +#: ports/nrf/common-hal/pulseio/PulseIn.c:241 py/obj.c:422 msgid "index out of range" msgstr "index hors gamme" @@ -653,123 +656,184 @@ msgstr "AnalogOut non supporté" msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:125 -#, c-format -msgid "Failed to change softdevice state, error: 0x%08lX" +#: ports/nrf/common-hal/bleio/Adapter.c:110 +#, fuzzy +msgid "Failed to change softdevice state" msgstr "Echec de la modification de l'état du périph., erreur: 0x%08lX" -#: ports/nrf/common-hal/bleio/Adapter.c:135 -#, c-format -msgid "Failed to get softdevice state, error: 0x%08lX" +#: ports/nrf/common-hal/bleio/Adapter.c:119 +#, fuzzy +msgid "Failed to get softdevice state" msgstr "Echec de l'obtention de l'état du périph., erreur: 0x%08lX" -#: ports/nrf/common-hal/bleio/Adapter.c:155 -#, c-format -msgid "Failed to get local address, error: 0x%08lX" +#: ports/nrf/common-hal/bleio/Adapter.c:138 +#, fuzzy +msgid "Failed to get local address" msgstr "Echec de l'obtention de l'adresse locale, erreur: 0x%08lX" -#: ports/nrf/common-hal/bleio/Characteristic.c:52 -#, fuzzy, c-format -msgid "Failed to write gatts value, status: 0x%08lX" -msgstr "Impossible d'écrire la valeur de gatts. status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Characteristic.c:76 -#, fuzzy, c-format -msgid "Failed to notify attribute value, status: 0x%08lX" -msgstr "Impossible de notifier la valeur de l'attribut. status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Characteristic.c:91 -#, fuzzy, c-format -msgid "Failed to read attribute value, status: 0x%08lX" -msgstr "Impossible de lire la valeur de l'attribut. status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Characteristic.c:119 -#: ports/nrf/common-hal/bleio/Device.c:272 -#: ports/nrf/common-hal/bleio/Device.c:307 -#, c-format -msgid "Failed to acquire mutex, status: 0x%08lX" -msgstr "Echec de l'obtention de mutex, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Characteristic.c:126 -#, fuzzy, c-format -msgid "Failed to write attribute value, status: 0x%08lX" -msgstr "Impossible d'écrire la valeur de l'attribut. status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Characteristic.c:138 -#: ports/nrf/common-hal/bleio/Device.c:284 -#: ports/nrf/common-hal/bleio/Device.c:319 -#: ports/nrf/common-hal/bleio/Device.c:354 -#: ports/nrf/common-hal/bleio/Device.c:391 -#, c-format -msgid "Failed to release mutex, status: 0x%08lX" -msgstr "Impossible de libérer mutex, status: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Device.c:81 -#: ports/nrf/common-hal/bleio/Device.c:114 -msgid "Can not fit data into the advertisment packet" +#: ports/nrf/common-hal/bleio/Broadcaster.c:48 +msgid "interval not in range 0.0020 to 10.24" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:266 -#, fuzzy, c-format -msgid "Failed to discover serivices, status: 0x%08lX" -msgstr "Echec de la découverte de services, statut: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Device.c:403 -#: ports/nrf/common-hal/bleio/Scanner.c:76 -#, fuzzy, c-format -msgid "Failed to continue scanning, status: 0x%0xlX" -msgstr "Impossible de commencer à scanner. statut: 0x%0xlX" - -#: ports/nrf/common-hal/bleio/Device.c:436 -#, fuzzy, c-format -msgid "Failed to connect, status: 0x%08lX" -msgstr "Connection impossible. statut: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Device.c:513 -#, c-format -msgid "Failed to add service, status: 0x%08lX" -msgstr "Echec de l'ajout de service, statut: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Device.c:531 -#, c-format -msgid "Failed to start advertisment, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Broadcaster.c:58 +#: ports/nrf/common-hal/bleio/Peripheral.c:56 +msgid "Data too large for advertisement packet" msgstr "" -#: ports/nrf/common-hal/bleio/Device.c:549 +#: ports/nrf/common-hal/bleio/Broadcaster.c:83 +#: ports/nrf/common-hal/bleio/Peripheral.c:324 #, fuzzy, c-format -msgid "Failed to stop advertisment, status: 0x%08lX" -msgstr "Echec de l'ajout de service, statut: 0x%08lX" - -#: ports/nrf/common-hal/bleio/Device.c:575 -#: ports/nrf/common-hal/bleio/Scanner.c:103 -#, fuzzy, c-format -msgid "Failed to start scanning, status: 0x%0xlX" +msgid "Failed to start advertising, err 0x%04x" msgstr "Impossible de commencer à scanner, statut: 0x%0xlX" -#: ports/nrf/common-hal/bleio/Device.c:592 +#: ports/nrf/common-hal/bleio/Broadcaster.c:96 +#: ports/nrf/common-hal/bleio/Peripheral.c:336 #, fuzzy, c-format -msgid "Failed to create mutex, status: 0x%0xlX" +msgid "Failed to stop advertising, err 0x%04x" +msgstr "Echec de l'ajout de service, statut: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:59 +#, fuzzy, c-format +msgid "Failed to read CCCD value, err 0x%04x" +msgstr "Impossible de lire la valeur de l'attribut. status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:89 +#, fuzzy, c-format +msgid "Failed to read gatts value, err 0x%04x" +msgstr "Impossible d'écrire la valeur de gatts. status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:106 +#, fuzzy, c-format +msgid "Failed to write gatts value, err 0x%04x" +msgstr "Impossible d'écrire la valeur de gatts. status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:132 +#, fuzzy, c-format +msgid "Failed to notify or indicate attribute value, err %0x04x" +msgstr "Impossible de notifier la valeur de l'attribut. status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:144 +#, fuzzy, c-format +msgid "Failed to read attribute value, err %0x04x" +msgstr "Impossible de lire la valeur de l'attribut. status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:172 +#, fuzzy, c-format +msgid "Failed to acquire mutex, err 0x%04x" +msgstr "Echec de l'obtention de mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:178 +#, fuzzy, c-format +msgid "Failed to write attribute value, err 0x%04x" +msgstr "Impossible d'écrire la valeur de l'attribut. status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:189 +#, fuzzy, c-format +msgid "Failed to release mutex, err 0x%04x" +msgstr "Impossible de libérer mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Characteristic.c:251 +#: ports/nrf/common-hal/bleio/Characteristic.c:284 +msgid "bad GATT role" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:80 +#: ports/nrf/common-hal/bleio/Device.c:112 +msgid "Data too large for the advertisement packet" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:262 +#, fuzzy +msgid "Failed to discover services" +msgstr "Echec de la découverte de services, statut: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:267 +#: ports/nrf/common-hal/bleio/Device.c:300 +#, fuzzy +msgid "Failed to acquire mutex" +msgstr "Echec de l'obtention de mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:278 +#: ports/nrf/common-hal/bleio/Device.c:311 +#: ports/nrf/common-hal/bleio/Device.c:342 +#: ports/nrf/common-hal/bleio/Device.c:376 +#, fuzzy +msgid "Failed to release mutex" +msgstr "Impossible de libérer mutex, status: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:387 +#, fuzzy +msgid "Failed to continue scanning" +msgstr "Impossible de commencer à scanner. statut: 0x%0xlX" + +#: ports/nrf/common-hal/bleio/Device.c:419 +#, fuzzy +msgid "Failed to connect:" +msgstr "Connection impossible. statut: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:489 +#, fuzzy +msgid "Failed to add service" +msgstr "Echec de l'ajout de service, statut: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:506 +#, fuzzy +msgid "Failed to start advertising" +msgstr "Echec de l'ajout de service, statut: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:523 +#, fuzzy +msgid "Failed to stop advertising" +msgstr "Echec de l'ajout de service, statut: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Device.c:548 +#, fuzzy +msgid "Failed to start scanning" +msgstr "Impossible de commencer à scanner, statut: 0x%0xlX" + +#: ports/nrf/common-hal/bleio/Device.c:564 +#, fuzzy +msgid "Failed to create mutex" msgstr "Echec de la création de mutex, statut: 0x%0xlX" -#: ports/nrf/common-hal/bleio/Service.c:83 -#, c-format -msgid "Failed to add characteristic, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Peripheral.c:304 +#, fuzzy, c-format +msgid "Failed to add service, err 0x%04x" +msgstr "Echec de l'ajout de service, statut: 0x%08lX" + +#: ports/nrf/common-hal/bleio/Scanner.c:75 +#, fuzzy, c-format +msgid "Failed to continue scanning, err 0x%04x" +msgstr "Impossible de commencer à scanner. statut: 0x%0xlX" + +#: ports/nrf/common-hal/bleio/Scanner.c:101 +#, fuzzy, c-format +msgid "Failed to start scanning, err 0x%04x" +msgstr "Impossible de commencer à scanner, statut: 0x%0xlX" + +#: ports/nrf/common-hal/bleio/Service.c:88 +#, fuzzy, c-format +msgid "Failed to add characteristic, err 0x%04x" msgstr "Echec de l'ajout de caractéristique, statut: 0x%08lX" -#: ports/nrf/common-hal/bleio/UUID.c:97 +#: ports/nrf/common-hal/bleio/Service.c:92 +msgid "Characteristic already in use by another Service." +msgstr "" + +#: ports/nrf/common-hal/bleio/UUID.c:54 #, fuzzy, c-format -msgid "Failed to add Vendor Specific UUID, status: 0x%08lX" +msgid "Failed to register Vendor-Specific UUID, err 0x%04x" msgstr "Echec de l'ajout de l'UUID Vendor Specific, , statut: 0x%08lX" -#: ports/nrf/common-hal/bleio/UUID.c:102 -msgid "Invalid UUID string length" -msgstr "Longeur de chaîne UUID invalide" +#: ports/nrf/common-hal/bleio/UUID.c:73 +#, c-format +msgid "Could not decode ble_uuid, err 0x%04x" +msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:109 -#: shared-bindings/bleio/Characteristic.c:125 -#: shared-bindings/bleio/Service.c:105 -msgid "Invalid UUID parameter" -msgstr "Paramètre UUID invalide" +#: ports/nrf/common-hal/bleio/UUID.c:88 +#, fuzzy +msgid "Unexpected nrfx uuid type" +msgstr "indentation inattendue" #: ports/nrf/common-hal/busio/I2C.c:98 #, fuzzy @@ -805,9 +869,9 @@ msgstr "parité impaire non supportée" msgid "busio.UART not available" msgstr "busio.UART n'est pas disponible" -#: ports/nrf/common-hal/microcontroller/Processor.c:49 -#, c-format -msgid "Can not get temperature. status: 0x%02x" +#: ports/nrf/common-hal/microcontroller/Processor.c:48 +#, fuzzy +msgid "Cannot get temperature" msgstr "Impossible de lire la température. status: 0x%02x" #: ports/nrf/common-hal/pulseio/PWMOut.c:161 @@ -1960,7 +2024,7 @@ msgstr "l'allocation de mémoire a échoué, la pile est vérrouillé" msgid "memory allocation failed, allocating %u bytes" msgstr "l'allocation de mémoire a échoué en allouant %u octets" -#: py/runtime.c:1609 +#: py/runtime.c:1620 msgid "maximum recursion depth exceeded" msgstr "profondeur maximale de récursivité dépassée" @@ -2119,14 +2183,31 @@ msgstr "Nombre de bits invalide" msgid "buffer slices must be of equal length" msgstr "les slices de tampon doivent être de longueurs égales" -#: shared-bindings/bleio/Address.c:101 -msgid "Wrong address length" -msgstr "Mauvaise longueur d'adresse" +#: shared-bindings/bleio/Address.c:119 +#, c-format +msgid "Address is not %d bytes long or is in wrong format" +msgstr "" -#: shared-bindings/bleio/Address.c:107 +#: shared-bindings/bleio/Address.c:126 +#, fuzzy, c-format +msgid "Address must be %d bytes long" +msgstr "la palette doit être longue de 32 octets" + +#: shared-bindings/bleio/Characteristic.c:81 +#: shared-bindings/bleio/Descriptor.c:93 shared-bindings/bleio/Service.c:78 #, fuzzy -msgid "Wrong number of bytes provided" -msgstr "mauvais nombre d'octets fourni'" +msgid "Expected a UUID" +msgstr "Attendu : %q" + +#: shared-bindings/bleio/CharacteristicBuffer.c:68 +#, fuzzy +msgid "buffer_size must be >= 1" +msgstr "les slices de tampon doivent être de longueurs égales" + +#: shared-bindings/bleio/CharacteristicBuffer.c:72 +#, fuzzy +msgid "Expected a Characteristic" +msgstr "Impossible d'ajouter la Characteristic." #: shared-bindings/bleio/Device.c:210 msgid "Can't add services in Central mode" @@ -2144,6 +2225,40 @@ msgstr "Modification du nom impossible en mode Central" msgid "Can't advertise in Central mode" msgstr "" +#: shared-bindings/bleio/Peripheral.c:111 +msgid "services includes an object that is not a Service" +msgstr "" + +#: shared-bindings/bleio/Peripheral.c:124 +#, fuzzy +msgid "name must be a string" +msgstr "les noms doivent être des chaînes de caractère" + +#: shared-bindings/bleio/Service.c:90 +msgid "characteristics includes an object that is not a Characteristic" +msgstr "" + +#: shared-bindings/bleio/Service.c:96 +msgid "Characteristic UUID doesn't match Service UUID" +msgstr "" + +#: shared-bindings/bleio/UUID.c:66 +msgid "UUID integer value not in range 0 to 0xffff" +msgstr "" + +#: shared-bindings/bleio/UUID.c:75 +msgid "UUID value is not int or byte buffer" +msgstr "" + +#: shared-bindings/bleio/UUID.c:79 +#, fuzzy +msgid "Byte buffer must be 16 bytes." +msgstr "le tampon doit être un objet bytes-like" + +#: shared-bindings/bleio/UUID.c:120 +msgid "not a 128-bit UUID" +msgstr "" + #: shared-bindings/busio/I2C.c:120 msgid "Function requires lock." msgstr "La fonction nécessite un verrou." @@ -2632,6 +2747,19 @@ msgstr "" "Le bouton 'reset' a été appuyé pendant le démarrage de CircuitPython. " "Appuyer denouveau pour quitter de le mode sans-échec.\n" +#~ msgid "Invalid UUID string length" +#~ msgstr "Longeur de chaîne UUID invalide" + +#~ msgid "Invalid UUID parameter" +#~ msgstr "Paramètre UUID invalide" + +#~ msgid "Wrong address length" +#~ msgstr "Mauvaise longueur d'adresse" + +#, fuzzy +#~ msgid "Wrong number of bytes provided" +#~ msgstr "mauvais nombre d'octets fourni'" + #~ msgid "Looks like our core CircuitPython code crashed hard. Whoops!\n" #~ msgstr "" #~ "Il semblerait que votre code CircuitPython a durement planté. Oups!\n" diff --git a/locale/it_IT.po b/locale/it_IT.po index 3003d8c915..9b54d5dc9a 100644 --- a/locale/it_IT.po +++ b/locale/it_IT.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-10 11:05-0800\n" +"POT-Creation-Date: 2019-01-10 21:32-0500\n" "PO-Revision-Date: 2018-10-02 16:27+0200\n" "Last-Translator: Enrico Paganin \n" "Language-Team: \n" @@ -406,17 +406,20 @@ msgstr "Canale EXTINT già in uso" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:118 #: ports/esp8266/common-hal/pulseio/PulseIn.c:86 +#: ports/nrf/common-hal/pulseio/PulseIn.c:129 #, c-format msgid "Failed to allocate RX buffer of %d bytes" msgstr "Fallita allocazione del buffer RX di %d byte" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:205 #: ports/esp8266/common-hal/pulseio/PulseIn.c:151 +#: ports/nrf/common-hal/pulseio/PulseIn.c:254 msgid "pop from an empty PulseIn" msgstr "pop sun un PulseIn vuoto" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422 +#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 +#: ports/nrf/common-hal/pulseio/PulseIn.c:241 py/obj.c:422 msgid "index out of range" msgstr "indice fuori intervallo" @@ -655,124 +658,185 @@ msgstr "funzionalità AnalogOut non supportata" msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:125 -#, c-format -msgid "Failed to change softdevice state, error: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Adapter.c:135 -#, c-format -msgid "Failed to get softdevice state, error: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Adapter.c:155 -#, c-format -msgid "Failed to get local address, error: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Characteristic.c:52 -#, fuzzy, c-format -msgid "Failed to write gatts value, status: 0x%08lX" -msgstr "Impossibile scrivere valore dell'attributo. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Characteristic.c:76 -#, fuzzy, c-format -msgid "Failed to notify attribute value, status: 0x%08lX" -msgstr "Impossibile notificare valore dell'attributo. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Characteristic.c:91 -#, fuzzy, c-format -msgid "Failed to read attribute value, status: 0x%08lX" -msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Characteristic.c:119 -#: ports/nrf/common-hal/bleio/Device.c:272 -#: ports/nrf/common-hal/bleio/Device.c:307 -#, c-format -msgid "Failed to acquire mutex, status: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Characteristic.c:126 -#, fuzzy, c-format -msgid "Failed to write attribute value, status: 0x%08lX" -msgstr "Impossibile scrivere valore dell'attributo. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Characteristic.c:138 -#: ports/nrf/common-hal/bleio/Device.c:284 -#: ports/nrf/common-hal/bleio/Device.c:319 -#: ports/nrf/common-hal/bleio/Device.c:354 -#: ports/nrf/common-hal/bleio/Device.c:391 -#, c-format -msgid "Failed to release mutex, status: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Device.c:81 -#: ports/nrf/common-hal/bleio/Device.c:114 +#: ports/nrf/common-hal/bleio/Adapter.c:110 #, fuzzy -msgid "Can not fit data into the advertisment packet" +msgid "Failed to change softdevice state" +msgstr "Impossibile fermare advertisement. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Adapter.c:119 +#, fuzzy +msgid "Failed to get softdevice state" +msgstr "Impossibile fermare advertisement. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Adapter.c:138 +msgid "Failed to get local address" +msgstr "" + +#: ports/nrf/common-hal/bleio/Broadcaster.c:48 +msgid "interval not in range 0.0020 to 10.24" +msgstr "" + +#: ports/nrf/common-hal/bleio/Broadcaster.c:58 +#: ports/nrf/common-hal/bleio/Peripheral.c:56 +#, fuzzy +msgid "Data too large for advertisement packet" msgstr "Impossibile inserire dati nel pacchetto di advertisement." -#: ports/nrf/common-hal/bleio/Device.c:266 -#, c-format -msgid "Failed to discover serivices, status: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Device.c:403 -#: ports/nrf/common-hal/bleio/Scanner.c:76 +#: ports/nrf/common-hal/bleio/Broadcaster.c:83 +#: ports/nrf/common-hal/bleio/Peripheral.c:324 #, fuzzy, c-format -msgid "Failed to continue scanning, status: 0x%0xlX" -msgstr "Impossible iniziare la scansione. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Device.c:436 -#, fuzzy, c-format -msgid "Failed to connect, status: 0x%08lX" -msgstr "Impossibile connettersi. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Device.c:513 -#, fuzzy, c-format -msgid "Failed to add service, status: 0x%08lX" -msgstr "Impossibile fermare advertisement. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Device.c:531 -#, fuzzy, c-format -msgid "Failed to start advertisment, status: 0x%08lX" +msgid "Failed to start advertising, err 0x%04x" msgstr "Impossibile avviare advertisement. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:549 +#: ports/nrf/common-hal/bleio/Broadcaster.c:96 +#: ports/nrf/common-hal/bleio/Peripheral.c:336 #, fuzzy, c-format -msgid "Failed to stop advertisment, status: 0x%08lX" +msgid "Failed to stop advertising, err 0x%04x" msgstr "Impossibile fermare advertisement. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:575 -#: ports/nrf/common-hal/bleio/Scanner.c:103 +#: ports/nrf/common-hal/bleio/Characteristic.c:59 #, fuzzy, c-format -msgid "Failed to start scanning, status: 0x%0xlX" -msgstr "Impossible iniziare la scansione. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Device.c:592 -#, fuzzy, c-format -msgid "Failed to create mutex, status: 0x%0xlX" +msgid "Failed to read CCCD value, err 0x%04x" msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Service.c:83 -#, c-format -msgid "Failed to add characteristic, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Characteristic.c:89 +#, fuzzy, c-format +msgid "Failed to read gatts value, err 0x%04x" +msgstr "Impossibile scrivere valore dell'attributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:106 +#, fuzzy, c-format +msgid "Failed to write gatts value, err 0x%04x" +msgstr "Impossibile scrivere valore dell'attributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:132 +#, fuzzy, c-format +msgid "Failed to notify or indicate attribute value, err %0x04x" +msgstr "Impossibile notificare valore dell'attributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:144 +#, fuzzy, c-format +msgid "Failed to read attribute value, err %0x04x" +msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:172 +#, fuzzy, c-format +msgid "Failed to acquire mutex, err 0x%04x" +msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:178 +#, fuzzy, c-format +msgid "Failed to write attribute value, err 0x%04x" +msgstr "Impossibile scrivere valore dell'attributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:189 +#, fuzzy, c-format +msgid "Failed to release mutex, err 0x%04x" +msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:251 +#: ports/nrf/common-hal/bleio/Characteristic.c:284 +msgid "bad GATT role" msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:97 +#: ports/nrf/common-hal/bleio/Device.c:80 +#: ports/nrf/common-hal/bleio/Device.c:112 +#, fuzzy +msgid "Data too large for the advertisement packet" +msgstr "Impossibile inserire dati nel pacchetto di advertisement." + +#: ports/nrf/common-hal/bleio/Device.c:262 +#, fuzzy +msgid "Failed to discover services" +msgstr "Impossibile fermare advertisement. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:267 +#: ports/nrf/common-hal/bleio/Device.c:300 +#, fuzzy +msgid "Failed to acquire mutex" +msgstr "Impossibile allocare buffer RX" + +#: ports/nrf/common-hal/bleio/Device.c:278 +#: ports/nrf/common-hal/bleio/Device.c:311 +#: ports/nrf/common-hal/bleio/Device.c:342 +#: ports/nrf/common-hal/bleio/Device.c:376 +#, fuzzy +msgid "Failed to release mutex" +msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:387 +#, fuzzy +msgid "Failed to continue scanning" +msgstr "Impossible iniziare la scansione. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:419 +#, fuzzy +msgid "Failed to connect:" +msgstr "Impossibile connettersi. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:489 +#, fuzzy +msgid "Failed to add service" +msgstr "Impossibile fermare advertisement. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:506 +#, fuzzy +msgid "Failed to start advertising" +msgstr "Impossibile avviare advertisement. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:523 +#, fuzzy +msgid "Failed to stop advertising" +msgstr "Impossibile fermare advertisement. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:548 +#, fuzzy +msgid "Failed to start scanning" +msgstr "Impossible iniziare la scansione. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:564 +#, fuzzy +msgid "Failed to create mutex" +msgstr "Impossibile leggere valore dell'attributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Peripheral.c:304 #, fuzzy, c-format -msgid "Failed to add Vendor Specific UUID, status: 0x%08lX" +msgid "Failed to add service, err 0x%04x" +msgstr "Impossibile fermare advertisement. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Scanner.c:75 +#, fuzzy, c-format +msgid "Failed to continue scanning, err 0x%04x" +msgstr "Impossible iniziare la scansione. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Scanner.c:101 +#, fuzzy, c-format +msgid "Failed to start scanning, err 0x%04x" +msgstr "Impossible iniziare la scansione. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Service.c:88 +#, fuzzy, c-format +msgid "Failed to add characteristic, err 0x%04x" +msgstr "Impossibile fermare advertisement. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Service.c:92 +msgid "Characteristic already in use by another Service." +msgstr "" + +#: ports/nrf/common-hal/bleio/UUID.c:54 +#, fuzzy, c-format +msgid "Failed to register Vendor-Specific UUID, err 0x%04x" msgstr "Non è possibile aggiungere l'UUID del vendor specifico da 128-bit" -#: ports/nrf/common-hal/bleio/UUID.c:102 -msgid "Invalid UUID string length" -msgstr "Lunghezza della stringa UUID non valida" +#: ports/nrf/common-hal/bleio/UUID.c:73 +#, c-format +msgid "Could not decode ble_uuid, err 0x%04x" +msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:109 -#: shared-bindings/bleio/Characteristic.c:125 -#: shared-bindings/bleio/Service.c:105 -msgid "Invalid UUID parameter" -msgstr "Parametro UUID non valido" +#: ports/nrf/common-hal/bleio/UUID.c:88 +#, fuzzy +msgid "Unexpected nrfx uuid type" +msgstr "indentazione inaspettata" #: ports/nrf/common-hal/busio/I2C.c:98 msgid "All I2C peripherals are in use" @@ -806,9 +870,9 @@ msgstr "operazione I2C non supportata" msgid "busio.UART not available" msgstr "busio.UART non ancora implementato" -#: ports/nrf/common-hal/microcontroller/Processor.c:49 -#, c-format -msgid "Can not get temperature. status: 0x%02x" +#: ports/nrf/common-hal/microcontroller/Processor.c:48 +#, fuzzy +msgid "Cannot get temperature" msgstr "Impossibile leggere la temperatura. status: 0x%02x" #: ports/nrf/common-hal/pulseio/PWMOut.c:161 @@ -1956,7 +2020,7 @@ msgstr "allocazione di memoria fallita, l'heap è bloccato" msgid "memory allocation failed, allocating %u bytes" msgstr "allocazione di memoria fallita, allocando %u byte" -#: py/runtime.c:1609 +#: py/runtime.c:1620 msgid "maximum recursion depth exceeded" msgstr "profondità massima di ricorsione superata" @@ -2116,14 +2180,31 @@ msgstr "Numero di bit non valido" msgid "buffer slices must be of equal length" msgstr "slice del buffer devono essere della stessa lunghezza" -#: shared-bindings/bleio/Address.c:101 -msgid "Wrong address length" +#: shared-bindings/bleio/Address.c:119 +#, c-format +msgid "Address is not %d bytes long or is in wrong format" msgstr "" -#: shared-bindings/bleio/Address.c:107 +#: shared-bindings/bleio/Address.c:126 +#, fuzzy, c-format +msgid "Address must be %d bytes long" +msgstr "la palette deve essere lunga 32 byte" + +#: shared-bindings/bleio/Characteristic.c:81 +#: shared-bindings/bleio/Descriptor.c:93 shared-bindings/bleio/Service.c:78 #, fuzzy -msgid "Wrong number of bytes provided" -msgstr "numero di argomenti errato" +msgid "Expected a UUID" +msgstr "Atteso un %q" + +#: shared-bindings/bleio/CharacteristicBuffer.c:68 +#, fuzzy +msgid "buffer_size must be >= 1" +msgstr "slice del buffer devono essere della stessa lunghezza" + +#: shared-bindings/bleio/CharacteristicBuffer.c:72 +#, fuzzy +msgid "Expected a Characteristic" +msgstr "Non è possibile aggiungere Characteristic." #: shared-bindings/bleio/Device.c:210 msgid "Can't add services in Central mode" @@ -2141,6 +2222,40 @@ msgstr "" msgid "Can't advertise in Central mode" msgstr "" +#: shared-bindings/bleio/Peripheral.c:111 +msgid "services includes an object that is not a Service" +msgstr "" + +#: shared-bindings/bleio/Peripheral.c:124 +#, fuzzy +msgid "name must be a string" +msgstr "argomenti nominati devono essere stringhe" + +#: shared-bindings/bleio/Service.c:90 +msgid "characteristics includes an object that is not a Characteristic" +msgstr "" + +#: shared-bindings/bleio/Service.c:96 +msgid "Characteristic UUID doesn't match Service UUID" +msgstr "" + +#: shared-bindings/bleio/UUID.c:66 +msgid "UUID integer value not in range 0 to 0xffff" +msgstr "" + +#: shared-bindings/bleio/UUID.c:75 +msgid "UUID value is not int or byte buffer" +msgstr "" + +#: shared-bindings/bleio/UUID.c:79 +#, fuzzy +msgid "Byte buffer must be 16 bytes." +msgstr "i buffer devono essere della stessa lunghezza" + +#: shared-bindings/bleio/UUID.c:120 +msgid "not a 128-bit UUID" +msgstr "" + #: shared-bindings/busio/I2C.c:120 msgid "Function requires lock." msgstr "" @@ -2601,6 +2716,16 @@ msgid "" "exit safe mode.\n" msgstr "" +#~ msgid "Invalid UUID string length" +#~ msgstr "Lunghezza della stringa UUID non valida" + +#~ msgid "Invalid UUID parameter" +#~ msgstr "Parametro UUID non valido" + +#, fuzzy +#~ msgid "Wrong number of bytes provided" +#~ msgstr "numero di argomenti errato" + #~ msgid "Invalid Service type" #~ msgstr "Tipo di servizio non valido" diff --git a/locale/pt_BR.po b/locale/pt_BR.po index 56810874ab..85fe90909c 100644 --- a/locale/pt_BR.po +++ b/locale/pt_BR.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-10 11:05-0800\n" +"POT-Creation-Date: 2019-01-10 21:32-0500\n" "PO-Revision-Date: 2018-10-02 21:14-0000\n" "Last-Translator: \n" "Language-Team: \n" @@ -400,17 +400,20 @@ msgstr "Canal EXTINT em uso" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:118 #: ports/esp8266/common-hal/pulseio/PulseIn.c:86 +#: ports/nrf/common-hal/pulseio/PulseIn.c:129 #, c-format msgid "Failed to allocate RX buffer of %d bytes" msgstr "Falha ao alocar buffer RX de %d bytes" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:205 #: ports/esp8266/common-hal/pulseio/PulseIn.c:151 +#: ports/nrf/common-hal/pulseio/PulseIn.c:254 msgid "pop from an empty PulseIn" msgstr "" #: ports/atmel-samd/common-hal/pulseio/PulseIn.c:237 -#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 py/obj.c:422 +#: ports/esp8266/common-hal/pulseio/PulseIn.c:182 +#: ports/nrf/common-hal/pulseio/PulseIn.c:241 py/obj.c:422 msgid "index out of range" msgstr "Índice fora do intervalo" @@ -648,124 +651,182 @@ msgstr "Funcionalidade AnalogOut não suportada" msgid "Soft device assert, id: 0x%08lX, pc: 0x%08lX" msgstr "" -#: ports/nrf/common-hal/bleio/Adapter.c:125 -#, c-format -msgid "Failed to change softdevice state, error: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Adapter.c:135 -#, c-format -msgid "Failed to get softdevice state, error: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Adapter.c:155 -#, c-format -msgid "Failed to get local address, error: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Characteristic.c:52 -#, fuzzy, c-format -msgid "Failed to write gatts value, status: 0x%08lX" -msgstr "Não é possível gravar o valor do atributo. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Characteristic.c:76 -#, fuzzy, c-format -msgid "Failed to notify attribute value, status: 0x%08lX" -msgstr "Não é possível gravar o valor do atributo. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Characteristic.c:91 -#, fuzzy, c-format -msgid "Failed to read attribute value, status: 0x%08lX" -msgstr "Não é possível ler o valor do atributo. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Characteristic.c:119 -#: ports/nrf/common-hal/bleio/Device.c:272 -#: ports/nrf/common-hal/bleio/Device.c:307 -#, c-format -msgid "Failed to acquire mutex, status: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Characteristic.c:126 -#, fuzzy, c-format -msgid "Failed to write attribute value, status: 0x%08lX" -msgstr "Não é possível gravar o valor do atributo. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Characteristic.c:138 -#: ports/nrf/common-hal/bleio/Device.c:284 -#: ports/nrf/common-hal/bleio/Device.c:319 -#: ports/nrf/common-hal/bleio/Device.c:354 -#: ports/nrf/common-hal/bleio/Device.c:391 -#, c-format -msgid "Failed to release mutex, status: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Device.c:81 -#: ports/nrf/common-hal/bleio/Device.c:114 +#: ports/nrf/common-hal/bleio/Adapter.c:110 #, fuzzy -msgid "Can not fit data into the advertisment packet" +msgid "Failed to change softdevice state" +msgstr "Não pode parar propaganda. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Adapter.c:119 +#, fuzzy +msgid "Failed to get softdevice state" +msgstr "Não pode parar propaganda. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Adapter.c:138 +msgid "Failed to get local address" +msgstr "" + +#: ports/nrf/common-hal/bleio/Broadcaster.c:48 +msgid "interval not in range 0.0020 to 10.24" +msgstr "" + +#: ports/nrf/common-hal/bleio/Broadcaster.c:58 +#: ports/nrf/common-hal/bleio/Peripheral.c:56 +#, fuzzy +msgid "Data too large for advertisement packet" msgstr "Não é possível ajustar dados no pacote de anúncios." -#: ports/nrf/common-hal/bleio/Device.c:266 -#, c-format -msgid "Failed to discover serivices, status: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Device.c:403 -#: ports/nrf/common-hal/bleio/Scanner.c:76 -#, c-format -msgid "Failed to continue scanning, status: 0x%0xlX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Device.c:436 -#, c-format -msgid "Failed to connect, status: 0x%08lX" -msgstr "" - -#: ports/nrf/common-hal/bleio/Device.c:513 +#: ports/nrf/common-hal/bleio/Broadcaster.c:83 +#: ports/nrf/common-hal/bleio/Peripheral.c:324 #, fuzzy, c-format -msgid "Failed to add service, status: 0x%08lX" -msgstr "Não pode parar propaganda. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Device.c:531 -#, fuzzy, c-format -msgid "Failed to start advertisment, status: 0x%08lX" +msgid "Failed to start advertising, err 0x%04x" msgstr "Não é possível iniciar o anúncio. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:549 +#: ports/nrf/common-hal/bleio/Broadcaster.c:96 +#: ports/nrf/common-hal/bleio/Peripheral.c:336 #, fuzzy, c-format -msgid "Failed to stop advertisment, status: 0x%08lX" +msgid "Failed to stop advertising, err 0x%04x" msgstr "Não pode parar propaganda. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Device.c:575 -#: ports/nrf/common-hal/bleio/Scanner.c:103 +#: ports/nrf/common-hal/bleio/Characteristic.c:59 #, fuzzy, c-format -msgid "Failed to start scanning, status: 0x%0xlX" -msgstr "Não é possível iniciar o anúncio. status: 0x%02x" - -#: ports/nrf/common-hal/bleio/Device.c:592 -#, fuzzy, c-format -msgid "Failed to create mutex, status: 0x%0xlX" +msgid "Failed to read CCCD value, err 0x%04x" msgstr "Não é possível ler o valor do atributo. status: 0x%02x" -#: ports/nrf/common-hal/bleio/Service.c:83 -#, c-format -msgid "Failed to add characteristic, status: 0x%08lX" +#: ports/nrf/common-hal/bleio/Characteristic.c:89 +#, fuzzy, c-format +msgid "Failed to read gatts value, err 0x%04x" +msgstr "Não é possível gravar o valor do atributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:106 +#, fuzzy, c-format +msgid "Failed to write gatts value, err 0x%04x" +msgstr "Não é possível gravar o valor do atributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:132 +#, fuzzy, c-format +msgid "Failed to notify or indicate attribute value, err %0x04x" +msgstr "Não é possível gravar o valor do atributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:144 +#, fuzzy, c-format +msgid "Failed to read attribute value, err %0x04x" +msgstr "Não é possível ler o valor do atributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:172 +#, fuzzy, c-format +msgid "Failed to acquire mutex, err 0x%04x" +msgstr "Não é possível ler o valor do atributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:178 +#, fuzzy, c-format +msgid "Failed to write attribute value, err 0x%04x" +msgstr "Não é possível gravar o valor do atributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:189 +#, fuzzy, c-format +msgid "Failed to release mutex, err 0x%04x" +msgstr "Não é possível ler o valor do atributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Characteristic.c:251 +#: ports/nrf/common-hal/bleio/Characteristic.c:284 +msgid "bad GATT role" msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:97 +#: ports/nrf/common-hal/bleio/Device.c:80 +#: ports/nrf/common-hal/bleio/Device.c:112 +#, fuzzy +msgid "Data too large for the advertisement packet" +msgstr "Não é possível ajustar dados no pacote de anúncios." + +#: ports/nrf/common-hal/bleio/Device.c:262 +#, fuzzy +msgid "Failed to discover services" +msgstr "Não pode parar propaganda. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:267 +#: ports/nrf/common-hal/bleio/Device.c:300 +#, fuzzy +msgid "Failed to acquire mutex" +msgstr "Falha ao alocar buffer RX" + +#: ports/nrf/common-hal/bleio/Device.c:278 +#: ports/nrf/common-hal/bleio/Device.c:311 +#: ports/nrf/common-hal/bleio/Device.c:342 +#: ports/nrf/common-hal/bleio/Device.c:376 +#, fuzzy +msgid "Failed to release mutex" +msgstr "Não é possível ler o valor do atributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:387 +msgid "Failed to continue scanning" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:419 +msgid "Failed to connect:" +msgstr "" + +#: ports/nrf/common-hal/bleio/Device.c:489 +#, fuzzy +msgid "Failed to add service" +msgstr "Não pode parar propaganda. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:506 +#, fuzzy +msgid "Failed to start advertising" +msgstr "Não é possível iniciar o anúncio. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:523 +#, fuzzy +msgid "Failed to stop advertising" +msgstr "Não pode parar propaganda. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:548 +#, fuzzy +msgid "Failed to start scanning" +msgstr "Não é possível iniciar o anúncio. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Device.c:564 +#, fuzzy +msgid "Failed to create mutex" +msgstr "Não é possível ler o valor do atributo. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Peripheral.c:304 #, fuzzy, c-format -msgid "Failed to add Vendor Specific UUID, status: 0x%08lX" +msgid "Failed to add service, err 0x%04x" +msgstr "Não pode parar propaganda. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Scanner.c:75 +#, fuzzy, c-format +msgid "Failed to continue scanning, err 0x%04x" +msgstr "Não é possível iniciar o anúncio. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Scanner.c:101 +#, fuzzy, c-format +msgid "Failed to start scanning, err 0x%04x" +msgstr "Não é possível iniciar o anúncio. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Service.c:88 +#, fuzzy, c-format +msgid "Failed to add characteristic, err 0x%04x" +msgstr "Não pode parar propaganda. status: 0x%02x" + +#: ports/nrf/common-hal/bleio/Service.c:92 +msgid "Characteristic already in use by another Service." +msgstr "" + +#: ports/nrf/common-hal/bleio/UUID.c:54 +#, fuzzy, c-format +msgid "Failed to register Vendor-Specific UUID, err 0x%04x" msgstr "Não é possível adicionar o UUID de 128 bits específico do fornecedor." -#: ports/nrf/common-hal/bleio/UUID.c:102 -msgid "Invalid UUID string length" +#: ports/nrf/common-hal/bleio/UUID.c:73 +#, c-format +msgid "Could not decode ble_uuid, err 0x%04x" msgstr "" -#: ports/nrf/common-hal/bleio/UUID.c:109 -#: shared-bindings/bleio/Characteristic.c:125 -#: shared-bindings/bleio/Service.c:105 -msgid "Invalid UUID parameter" -msgstr "Parâmetro UUID inválido" +#: ports/nrf/common-hal/bleio/UUID.c:88 +msgid "Unexpected nrfx uuid type" +msgstr "" #: ports/nrf/common-hal/busio/I2C.c:98 msgid "All I2C peripherals are in use" @@ -798,9 +859,9 @@ msgstr "I2C operação não suportada" msgid "busio.UART not available" msgstr "busio.UART não disponível" -#: ports/nrf/common-hal/microcontroller/Processor.c:49 -#, c-format -msgid "Can not get temperature. status: 0x%02x" +#: ports/nrf/common-hal/microcontroller/Processor.c:48 +#, fuzzy +msgid "Cannot get temperature" msgstr "Não pode obter a temperatura. status: 0x%02x" #: ports/nrf/common-hal/pulseio/PWMOut.c:161 @@ -1935,7 +1996,7 @@ msgstr "" msgid "memory allocation failed, allocating %u bytes" msgstr "" -#: py/runtime.c:1609 +#: py/runtime.c:1620 msgid "maximum recursion depth exceeded" msgstr "" @@ -2088,13 +2149,31 @@ msgstr "Número inválido de bits" msgid "buffer slices must be of equal length" msgstr "" -#: shared-bindings/bleio/Address.c:101 -msgid "Wrong address length" +#: shared-bindings/bleio/Address.c:119 +#, c-format +msgid "Address is not %d bytes long or is in wrong format" msgstr "" -#: shared-bindings/bleio/Address.c:107 -msgid "Wrong number of bytes provided" -msgstr "" +#: shared-bindings/bleio/Address.c:126 +#, fuzzy, c-format +msgid "Address must be %d bytes long" +msgstr "buffers devem ser o mesmo tamanho" + +#: shared-bindings/bleio/Characteristic.c:81 +#: shared-bindings/bleio/Descriptor.c:93 shared-bindings/bleio/Service.c:78 +#, fuzzy +msgid "Expected a UUID" +msgstr "Esperado um" + +#: shared-bindings/bleio/CharacteristicBuffer.c:68 +#, fuzzy +msgid "buffer_size must be >= 1" +msgstr "buffers devem ser o mesmo tamanho" + +#: shared-bindings/bleio/CharacteristicBuffer.c:72 +#, fuzzy +msgid "Expected a Characteristic" +msgstr "Não é possível adicionar Característica." #: shared-bindings/bleio/Device.c:210 msgid "Can't add services in Central mode" @@ -2112,6 +2191,40 @@ msgstr "" msgid "Can't advertise in Central mode" msgstr "" +#: shared-bindings/bleio/Peripheral.c:111 +msgid "services includes an object that is not a Service" +msgstr "" + +#: shared-bindings/bleio/Peripheral.c:124 +#, fuzzy +msgid "name must be a string" +msgstr "heap deve ser uma lista" + +#: shared-bindings/bleio/Service.c:90 +msgid "characteristics includes an object that is not a Characteristic" +msgstr "" + +#: shared-bindings/bleio/Service.c:96 +msgid "Characteristic UUID doesn't match Service UUID" +msgstr "" + +#: shared-bindings/bleio/UUID.c:66 +msgid "UUID integer value not in range 0 to 0xffff" +msgstr "" + +#: shared-bindings/bleio/UUID.c:75 +msgid "UUID value is not int or byte buffer" +msgstr "" + +#: shared-bindings/bleio/UUID.c:79 +#, fuzzy +msgid "Byte buffer must be 16 bytes." +msgstr "buffers devem ser o mesmo tamanho" + +#: shared-bindings/bleio/UUID.c:120 +msgid "not a 128-bit UUID" +msgstr "" + #: shared-bindings/busio/I2C.c:120 msgid "Function requires lock." msgstr "" @@ -2557,32 +2670,32 @@ msgid "" "exit safe mode.\n" msgstr "" -#~ msgid "Can not add Service." -#~ msgstr "Não é possível adicionar o serviço." - -#~ msgid "Can not apply advertisement data. status: 0x%02x" -#~ msgstr "Não é possível aplicar dados de anúncio. status: 0x%02x" - -#~ msgid "Can not apply device name in the stack." -#~ msgstr "Não é possível aplicar o nome do dispositivo na pilha." - -#~ msgid "Baud rate too high for this SPI peripheral" -#~ msgstr "Taxa de transmissão muito alta para esse periférico SPI" - -#~ msgid "Cannot apply GAP parameters." -#~ msgstr "Não é possível aplicar parâmetros GAP." - -#~ msgid "Invalid Service type" -#~ msgstr "Tipo de serviço inválido" - -#~ msgid "Can encode UUID into the advertisement packet." -#~ msgstr "Pode codificar o UUID no pacote de anúncios." +#~ msgid "Can not add Characteristic." +#~ msgstr "Não é possível adicionar Característica." #~ msgid "Can not query for the device address." #~ msgstr "Não é possível consultar o endereço do dispositivo." -#~ msgid "Can not add Characteristic." -#~ msgstr "Não é possível adicionar Característica." - #~ msgid "Cannot set PPCP parameters." #~ msgstr "Não é possível definir parâmetros PPCP." + +#~ msgid "Can encode UUID into the advertisement packet." +#~ msgstr "Pode codificar o UUID no pacote de anúncios." + +#~ msgid "Invalid Service type" +#~ msgstr "Tipo de serviço inválido" + +#~ msgid "Cannot apply GAP parameters." +#~ msgstr "Não é possível aplicar parâmetros GAP." + +#~ msgid "Baud rate too high for this SPI peripheral" +#~ msgstr "Taxa de transmissão muito alta para esse periférico SPI" + +#~ msgid "Can not apply device name in the stack." +#~ msgstr "Não é possível aplicar o nome do dispositivo na pilha." + +#~ msgid "Can not apply advertisement data. status: 0x%02x" +#~ msgstr "Não é possível aplicar dados de anúncio. status: 0x%02x" + +#~ msgid "Invalid UUID parameter" +#~ msgstr "Parâmetro UUID inválido" diff --git a/ports/atmel-samd/Makefile b/ports/atmel-samd/Makefile index 4ac579441b..852de75f39 100644 --- a/ports/atmel-samd/Makefile +++ b/ports/atmel-samd/Makefile @@ -81,9 +81,10 @@ BASE_CFLAGS = \ -DCIRCUITPY_SAFE_RESTART_WORD=0xDEADBEEF \ --param max-inline-insns-single=500 - # Use these flags to debug build times and header includes. - # -ftime-report - # -H +# Use these flags to debug build times and header includes. +# -ftime-report +# -H + # NDEBUG disables assert() statements. This reduces code size pretty dramatically, per tannewt. ifeq ($(CHIP_FAMILY), samd21) diff --git a/ports/nrf/.gitignore b/ports/nrf/.gitignore index fc9f24b50d..cda23c7a90 100644 --- a/ports/nrf/.gitignore +++ b/ports/nrf/.gitignore @@ -1,8 +1,8 @@ # Old Nordic soft devices that don't allow redistribution ######################################################### -bluetooth/s132_nrf52_2.0.1/ +drivers/bluetooth/s132_nrf52_2.0.1/ -!bluetooth/*/*.hex +!drivers/bluetooth/*/*.hex # Build files ##################### diff --git a/ports/nrf/Makefile b/ports/nrf/Makefile index 4beddb491f..2bc5084754 100755 --- a/ports/nrf/Makefile +++ b/ports/nrf/Makefile @@ -79,12 +79,14 @@ CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_NRF5X -DCFG_TUD_CDC_RX_BUFSIZE=1024 -DCFG_TUD_C #Debugging/Optimization ifeq ($(DEBUG), 1) -#ASMFLAGS += -g -gtabs+ -CFLAGS += -O1 -ggdb -LDFLAGS += -O1 + #ASMFLAGS += -g -gtabs+ + CFLAGS += -O1 -ggdb + LDFLAGS += -O1 + # You may want to enable these flags to make setting breakpoints easier. + CFLAGS += -fno-inline -fno-ipa-sra else -CFLAGS += -Os -DNDEBUG -LDFLAGS += -Os + CFLAGS += -Os -DNDEBUG + LDFLAGS += -Os endif LIBM_FILE_NAME = $(shell $(CC) $(CFLAGS) -print-file-name=libm.a) @@ -171,9 +173,11 @@ ifneq ($(SD), ) SRC_COMMON_HAL += \ bleio/__init__.c \ bleio/Adapter.c \ + bleio/Broadcaster.c \ bleio/Characteristic.c \ + bleio/CharacteristicBuffer.c \ bleio/Descriptor.c \ - bleio/Device.c \ + bleio/Peripheral.c \ bleio/Scanner.c \ bleio/Service.c \ bleio/UUID.c @@ -196,8 +200,7 @@ SRC_BINDINGS_ENUMS += \ bleio/Address.c \ bleio/AddressType.c \ bleio/AdvertisementData.c \ - bleio/ScanEntry.c \ - bleio/UUIDType.c + bleio/ScanEntry.c endif SRC_SHARED_MODULE = \ diff --git a/ports/nrf/README.md b/ports/nrf/README.md index 11a7b028de..9413174bfb 100644 --- a/ports/nrf/README.md +++ b/ports/nrf/README.md @@ -22,9 +22,6 @@ This is a port of CircuitPython to the Nordic Semiconductor nRF52 series of chip ## Tested Hardware -* nRF52832 - * [PCA10040](http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.nrf52%2Fdita%2Fnrf52%2Fdevelopment%2Fnrf52_dev_kit.html) - * [Adafruit Feather nRF52](https://www.adafruit.com/product/3406) * nRF52840 * [PCA10056](http://www.nordicsemi.com/eng/Products/nRF52840-Preview-DK) @@ -36,10 +33,9 @@ the following links: > **NOTE**: These board specific readmes may be more up to date than the generic board-neutral documentation further down. -* Adafruit Feather nRF52: boards/feather_nrf52832/README.md: 512KB Flash, 64KB SRAM -* Adafruit Feather nRF52840: boards/feather_nrf52840_express/README.md: 1MB Flash, 256KB SRAM -* Nordic PCA10056 (uses nRF52840): boards/pca10056/README.md -* MakerDiary NRF52840 MDK: boards/makerdiary_nrf52840_mdk/README.md +* Adafruit Feather nRF52840: `boards/feather_nrf52840_express/README.md`: 1MB Flash, 256KB SRAM +* Nordic PCA10056 (uses nRF52840): `boards/pca10056/README.md` +* MakerDiary NRF52840 MDK: `boards/makerdiary_nrf52840_mdk/README.md` For all other board targets, see the generic notes below. @@ -77,9 +73,7 @@ Note: further tuning of features to include in bluetooth or even setting up the Target Board (BOARD) | Bluetooth Stack (SD) | Bluetooth Support | Flash Util -------------------------|-------------------------|------------------------|------------------------------- -pca10040 | s132 | Peripheral and Scanner | [Segger](#segger-targets) pca10056 | s140 | Peripheral and Scanner | [Segger](#segger-targets) -feather_nrf52832 | s132 | Peripheral and Scanner | [UART DFU](#dfu-targets) feather_nrf52840_express | s140 | Peripheral and Scanner | UF2 bootloader makerdiary_nrf52840_mdk | s140 | Peripheral and Scanner | pyocd or ARM mbed DAPLink @@ -109,10 +103,10 @@ run follow command to install [adafruit-nrfutil](https://github.com/adafruit/Ada * dfu-gen: Generates a Firmware zip to be used by the DFU flash application. * dfu-flash: Triggers the DFU flash application to upload the firmware from the generated Firmware zip file. -Example on how to generate and flash feather_nrf52832 target: +Example on how to generate and flash feather_nrf52840 target: - make BOARD=feather_nrf52832 SD=s132 - make BOARD=feather_nrf52832 SD=s132 dfu-gen dfu-flash + make BOARD=feather_nrf52840 SD=s140 + make BOARD=feather_nrf52840 SD=s140 dfu-gen dfu-flash ## Bluetooth LE REPL diff --git a/ports/nrf/bluetooth/ble_drv.c b/ports/nrf/bluetooth/ble_drv.c index 0b6daf7116..cdc56319bd 100644 --- a/ports/nrf/bluetooth/ble_drv.c +++ b/ports/nrf/bluetooth/ble_drv.c @@ -45,30 +45,44 @@ typedef struct event_handler { ble_drv_evt_handler_t func; } event_handler_t; -static event_handler_t *m_event_handlers; +static event_handler_t *m_event_handlers = NULL; + +void ble_drv_reset() { + // Linked list items will be gc'd. + m_event_handlers = NULL; +} void ble_drv_add_event_handler(ble_drv_evt_handler_t func, void *param) { - event_handler_t *handler = m_new_ll(event_handler_t, 1); - handler->next = NULL; - handler->param = param; - handler->func = func; - - if (m_event_handlers == NULL) { - m_event_handlers = handler; - return; - } - event_handler_t *it = m_event_handlers; - while (it->next != NULL) { + while (it != NULL) { + // If event handler and its corresponding param are already on the list, don't add again. if ((it->func == func) && (it->param == param)) { - m_free(handler); return; } - it = it->next; } - it->next = handler; + // Add a new handler to the front of the list + event_handler_t *handler = m_new_ll(event_handler_t, 1); + handler->next = m_event_handlers; + handler->param = param; + handler->func = func; + + m_event_handlers = handler; +} + +void ble_drv_remove_event_handler(ble_drv_evt_handler_t func, void *param) { + event_handler_t *it = m_event_handlers; + event_handler_t **prev = &m_event_handlers; + while (it != NULL) { + if ((it->func == func) && (it->param == param)) { + // Splice out the matching handler. + *prev = it->next; + return; + } + prev = &(it->next); + it = it->next; + } } void SD_EVT_IRQHandler(void) { diff --git a/ports/nrf/bluetooth/ble_drv.h b/ports/nrf/bluetooth/ble_drv.h index 0443b41b84..3d1f551c53 100644 --- a/ports/nrf/bluetooth/ble_drv.h +++ b/ports/nrf/bluetooth/ble_drv.h @@ -43,11 +43,15 @@ #define BLE_CONN_CFG_TAG_CUSTOM 1 #define MSEC_TO_UNITS(TIME, RESOLUTION) (((TIME) * 1000) / (RESOLUTION)) +// 0.625 msecs (625 usecs) +#define ADV_INTERVAL_UNIT_FLOAT_SECS (0.000625) #define UNIT_0_625_MS (625) #define UNIT_10_MS (10000) typedef void (*ble_drv_evt_handler_t)(ble_evt_t*, void*); +void ble_drv_reset(); void ble_drv_add_event_handler(ble_drv_evt_handler_t func, void *param); +void ble_drv_remove_event_handler(ble_drv_evt_handler_t func, void *param); #endif // MICROPY_INCLUDED_NRF_BLUETOOTH_BLE_DRV_H diff --git a/ports/nrf/bluetooth/bluetooth_common.mk b/ports/nrf/bluetooth/bluetooth_common.mk index 760955200e..5d094fcf8b 100644 --- a/ports/nrf/bluetooth/bluetooth_common.mk +++ b/ports/nrf/bluetooth/bluetooth_common.mk @@ -1,12 +1,4 @@ -ifeq ($(SD), s132) - CFLAGS += -DBLUETOOTH_SD=132 - -ifeq ($(SOFTDEV_VERSION), 2.0.1) - CFLAGS += -DBLE_API_VERSION=2 -else ifeq ($(SOFTDEV_VERSION), 5.0.0) - CFLAGS += -DBLE_API_VERSION=4 -endif -else ifeq ($(SD), s140) +ifeq ($(SD), s140) CFLAGS += -DBLUETOOTH_SD=140 CFLAGS += -DBLE_API_VERSION=4 else diff --git a/ports/nrf/bluetooth/download_ble_stack.sh b/ports/nrf/bluetooth/download_ble_stack.sh deleted file mode 100755 index 7e35c0680b..0000000000 --- a/ports/nrf/bluetooth/download_ble_stack.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash - -function download_s132_nrf52_2_0_1 -{ - echo "" - echo "####################################" - echo "### Downloading s132_nrf52_2.0.1 ###" - echo "####################################" - echo "" - - mkdir -p "${1}/s132_nrf52_2.0.1" - cd "${1}/s132_nrf52_2.0.1" - wget https://www.nordicsemi.com/api/sitecore/Products/MedialibraryZipDownload2 --post-data="ids=863031714A574444AADFE444EBE5BA9B|&fileName=DeviceDownload" -O temp.zip - unzip -u temp.zip - unzip -u s132nrf52201.zip - rm temp.zip s132nrf52201.zip - cd - -} - -SCRIPT_DIR="$(cd -P "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - -if [ $# -eq 0 ]; then - echo "No Bluetooth LE stack defined, downloading all." - download_s132_nrf52_2_0_1 "${SCRIPT_DIR}" -else - case $1 in - "s132_nrf52_2_0_1" ) - download_s132_nrf52_2_0_1 "${SCRIPT_DIR}" ;; - esac -fi - -exit 0 diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API-update.diff b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API-update.diff deleted file mode 100644 index f9b5fc8f7c..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API-update.diff +++ /dev/null @@ -1,1550 +0,0 @@ -|-----------------------------------------------------------------------------| -| 2 Mbps PHY Support | -|-----------------------------------------------------------------------------| - -//| -//| Bitfield for PHYs used by PHY commands and events below -//| -+/**@defgroup BLE_GAP_PHYS GAP PHYs -+ * @{ */ -+#define BLE_GAP_PHY_AUTO 0x00 /**< Automatic PHY selection. Refer @ref sd_ble_gap_phy_update for more information.*/ -+#define BLE_GAP_PHY_1MBPS 0x01 /**< 1 Mbps PHY. */ -+#define BLE_GAP_PHY_2MBPS 0x02 /**< 2 Mbps PHY. */ -+#define BLE_GAP_PHY_CODED 0x04 /**< Coded PHY. */ -+ -+/**@} */ - - -//| -//| PHY Update event: Notifies the application that the PHY has been changed, or that a PHY update -//| procedure is requested but the PHY is not changed. -//| -//| PHY Update Request event: Notifies the application that the peer has initiated a PHY Update Procedure. -//| Application must respond to this event with a SD_BLE_GAP_PHY_UPDATE command providing its PHY preferences, -//| otherwise the PHY Update procedure will time out. -//| - enum BLE_GAP_EVTS - { - BLE_GAP_EVT_SEC_REQUEST, /**< Security Request. \n See @ref ble_gap_evt_sec_request_t. */ - BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST, /**< Connection Parameter Update Request. \n Reply with @ref sd_ble_gap_conn_param_update. \n See @ref ble_gap_evt_conn_param_update_request_t. */ - BLE_GAP_EVT_SCAN_REQ_REPORT, /**< Scan request report. \n See @ref ble_gap_evt_scan_req_report_t. */ -- BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST, /**< Data Length Update request. \n Reply with @ref sd_ble_gap_data_length_update.\n See @ref ble_gap_evt_data_length_update_request_t. */ -+ BLE_GAP_EVT_PHY_UPDATE_REQUEST, /**< PHY Update Request. \n Reply with @ref sd_ble_gap_phy_update. \n See @ref ble_gap_evt_phy_update_request_t. */ -+ BLE_GAP_EVT_PHY_UPDATE, /**< PHY Update Procedure is complete. \n See @ref ble_gap_evt_phy_update_t. */ -+ BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST, /**< Data Length Update Request. \n Reply with @ref sd_ble_gap_data_length_update.\n See @ref ble_gap_evt_data_length_update_request_t. */ - BLE_GAP_EVT_DATA_LENGTH_UPDATE, /**< LL Data Channel PDU payload length updated. \n See @ref ble_gap_evt_data_length_update_t. */ - }; - - -+/**@brief PHY preferences for TX and RX -+ * @note tx_phys and rx_phys are bit fields. Multiple bits can be set in them to indicate multiple preferred PHYs for each direction. -+ * @code -+ * p_gap_phys->tx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; -+ * p_gap_phys->rx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; -+ * @endcode -+ * -+ */ -+typedef struct -+{ -+ uint8_t tx_phys; /**< Preferred transmit PHYs, see @ref BLE_GAP_PHYS. */ -+ uint8_t rx_phys; /**< Preferred receive PHYs, see @ref BLE_GAP_PHYS. */ -+} ble_gap_phys_t; -+ - -+/**@brief Event structure for @ref BLE_GAP_EVT_PHY_UPDATE_REQUEST. */ -+typedef struct -+{ -+ ble_gap_phys_t peer_preferred_phys; /**< The PHYs the peer prefers to use. */ -+} ble_gap_evt_phy_update_request_t; -+ -+/**@brief Event Structure for @ref BLE_GAP_EVT_PHY_UPDATE. */ -+typedef struct -+{ -+ uint8_t status; /**< Status of the procedure, see @ref BLE_HCI_STATUS_CODES.*/ -+ uint8_t tx_phy; /**< TX PHY for this connection, see @ref BLE_GAP_PHYS. */ -+ uint8_t rx_phy; /**< RX PHY for this connection, see @ref BLE_GAP_PHYS. */ -+} ble_gap_evt_phy_update_t; - - typedef struct - { - uint16_t conn_handle; /**< Connection Handle on which event occurred. */ - union /**< union alternative identified by evt_id in enclosing struct. */ - { - ble_gap_evt_conn_param_update_request_t conn_param_update_request; /**< Connection Parameter Update Parameters. */ -- ble_gap_evt_scan_req_report_t scan_req_report; /**< Scan Request Report parameters. */ -+ ble_gap_evt_scan_req_report_t scan_req_report; /**< Scan Request Report Parameters. */ -+ ble_gap_evt_phy_update_request_t phy_update_request; /**< PHY Update Request Event Parameters. */ -+ ble_gap_evt_phy_update_t phy_update; /**< PHY Update Parameters. */ - ble_gap_evt_data_length_update_request_t data_length_update_request; /**< Data Length Update Request Event Parameters. */ - ble_gap_evt_data_length_update_t data_length_update; /**< Data Length Update Event Parameters. */ - } params; /**< Event Parameters. */ - } ble_gap_evt_t; - -//| -//| PHY Update command. Use for initiating or responding to a PHY Update Procedure. -//| Either the master or the slave must call this function for the PHY to be changed. -//| - enum BLE_GAP_SVCS - { - SD_BLE_GAP_CONNECT, /**< Connect. */ - SD_BLE_GAP_CONNECT_CANCEL, /**< Cancel ongoing connection procedure. */ - SD_BLE_GAP_RSSI_GET, /**< Get the last RSSI sample. */ -+ SD_BLE_GAP_PHY_UPDATE, /**< Initiate or respond to a PHY Update Procedure. */ - SD_BLE_GAP_DATA_LENGTH_UPDATE, /**< Initiate or respond to a Data Length Update Procedure. */ - }; - - -+/**@brief Initiate or respond to a PHY Update Procedure -+ * -+ * @details This function is used to initiate or respond to a PHY Update Procedure. It will always generate a -+ * @ref BLE_GAP_EVT_PHY_UPDATE event if successfully executed. If @ref ble_gap_phys_t::tx_phys or @ref ble_gap_phys_t::rx_phys -+ * is @ref BLE_GAP_PHY_AUTO, then the stack will select a PHY for the respective direction based on the peer's PHY preferences -+ * and the local stack configuration. If the peer does not support the PHY Update Procedure, then the -+ * resulting @ref BLE_GAP_EVT_PHY_UPDATE event will have a status set to -+ * @ref BLE_HCI_UNSUPPORTED_REMOTE_FEATURE. -+ * If the PHY procedure was rejected by the peer due to a procedure collision, the status will be -+ * @ref BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION or @ref BLE_HCI_DIFFERENT_TRANSACTION_COLLISION. -+ * If the peer responds to the PHY Update procedure with invalid parameters, the status will be @ref BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS. -+ * If the PHY procedure was rejected by the peer for a different reason, the status will contain the reason as specified by the peer. -+ * -+ * @events -+ * @event{@ref BLE_GAP_EVT_PHY_UPDATE, Result of the PHY Update Procedure.} -+ * @endevents -+ * -+ * @mscs -+ * @mmsc{@ref BLE_GAP_CENTRAL_PHY_UPDATE} -+ * @mmsc{@ref BLE_GAP_PERIPHERAL_PHY_UPDATE} -+ * @endmscs -+ * -+ * @param[in] conn_handle Connection handle to indicate the connection for which the PHY Update is requested. -+ * @param[in] p_gap_phys Pointer to PHY structure. -+ * -+ * @retval ::NRF_SUCCESS Successfully requested a PHY Update. -+ * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. -+ * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. -+ * @retval ::NRF_ERROR_INVALID_PARAM Unsupported PHYs supplied to the call. -+ * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. -+ * @retval ::NRF_ERROR_BUSY Procedure is already in progress or not allowed at this time. Process pending events and wait for the pending procedure to complete and retry. -+ * -+ */ -+SVCALL(SD_BLE_GAP_PHY_UPDATE, uint32_t, sd_ble_gap_phy_update(uint16_t conn_handle, ble_gap_phys_t const *p_gap_phys)); -+ - - -//| -//| New BLE HCI status code -//| -+#define BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION 0x23 /**< LMP Error Transaction Collision/LL Procedure Collision. */ - -|-----------------------------------------------------------------------------| -| Connection-Oriented Channels in LE Credit Based Flow Control Mode | -|-----------------------------------------------------------------------------| - -//| -//| New L2CAP specific connection configuration ID -//| - enum BLE_CONN_CFGS - { - BLE_CONN_CFG_GAP = BLE_CONN_CFG_BASE, /**< BLE GAP specific connection configuration. */ - BLE_CONN_CFG_GATTC, /**< BLE GATTC specific connection configuration. */ - BLE_CONN_CFG_GATTS, /**< BLE GATTS specific connection configuration. */ - BLE_CONN_CFG_GATT, /**< BLE GATT specific connection configuration. */ -+ BLE_CONN_CFG_L2CAP, /**< BLE L2CAP specific connection configuration. */ - }; - - -//| -//| New L2CAP originated event -//| - typedef struct - { - ble_evt_hdr_t header; /**< Event header. */ - union - { - ble_common_evt_t common_evt; /**< Common Event, evt_id in BLE_EVT_* series. */ - ble_gap_evt_t gap_evt; /**< GAP originated event, evt_id in BLE_GAP_EVT_* series. */ - ble_gattc_evt_t gattc_evt; /**< GATT client originated event, evt_id in BLE_GATTC_EVT* series. */ - ble_gatts_evt_t gatts_evt; /**< GATT server originated event, evt_id in BLE_GATTS_EVT* series. */ -+ ble_l2cap_evt_t l2cap_evt; /**< L2CAP originated event, evt_id in BLE_L2CAP_EVT* series. */ - } evt; /**< Event union. */ - } ble_evt_t; - - -//| -//| New L2CAP connection configuration -//| - typedef struct - { - uint8_t conn_cfg_tag; /**< The application chosen tag it can use with the @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect() - calls to select this configuration when creating a connection. - Must be different for all connection configurations added and not @ref BLE_CONN_CFG_TAG_DEFAULT. */ - union { - ble_gap_conn_cfg_t gap_conn_cfg; /**< GAP connection configuration, cfg_id is @ref BLE_CONN_CFG_GAP. */ - ble_gattc_conn_cfg_t gattc_conn_cfg; /**< GATTC connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTC. */ - ble_gatts_conn_cfg_t gatts_conn_cfg; /**< GATTS connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTS. */ - ble_gatt_conn_cfg_t gatt_conn_cfg; /**< GATT connection configuration, cfg_id is @ref BLE_CONN_CFG_GATT. */ -+ ble_l2cap_conn_cfg_t l2cap_conn_cfg; /**< L2CAP connection configuration, cfg_id is @ref BLE_CONN_CFG_L2CAP. */ - } params; /**< Connection configuration union. */ - } ble_conn_cfg_t; - -//| -//| API additions related to Connection-Oriented Channels -//| -+/**@addtogroup BLE_L2CAP_TERMINOLOGY Terminology -+ * @{ -+ * @details -+ * -+ * L2CAP SDU -+ * - A data unit that the application can send/receive to/from a peer. -+ * -+ * L2CAP PDU -+ * - A data unit that is exchanged between local and remote L2CAP entities. -+ * It consists of L2CAP protocol control information and payload fields. -+ * The payload field can contain an L2CAP SDU or a part of an L2CAP SDU. -+ * -+ * L2CAP MTU -+ * - The maximum length of an L2CAP SDU. -+ * -+ * L2CAP MPS -+ * - The maximum length of an L2CAP PDU payload field. -+ * -+ * Credits -+ * - A value indicating the number of L2CAP PDUs that the receiver of the credit can send to the peer. -+ * @} */ -+ -+/**@addtogroup BLE_L2CAP_ENUMERATIONS Enumerations -+ * @{ */ -+ -+/**@brief L2CAP API SVC numbers. */ -+enum BLE_L2CAP_SVCS -+{ -+ SD_BLE_L2CAP_CH_SETUP = BLE_L2CAP_SVC_BASE, /**< Set up an L2CAP channel. */ -+ SD_BLE_L2CAP_CH_RELEASE, /**< Release an L2CAP channel. */ -+ SD_BLE_L2CAP_CH_RX, /**< Receive an SDU on an L2CAP channel. */ -+ SD_BLE_L2CAP_CH_TX, /**< Transmit an SDU on an L2CAP channel. */ -+ SD_BLE_L2CAP_CH_FLOW_CONTROL, /**< Advanced SDU reception flow control. */ -+}; -+ -+/**@brief L2CAP Event IDs. */ -+enum BLE_L2CAP_EVTS -+{ -+ BLE_L2CAP_EVT_CH_SETUP_REQUEST = BLE_L2CAP_EVT_BASE, /**< L2CAP Channel Setup Request event. -+ \n See @ref ble_l2cap_evt_ch_setup_request_t. */ -+ BLE_L2CAP_EVT_CH_SETUP_REFUSED, /**< L2CAP Channel Setup Refused event. -+ \n See @ref ble_l2cap_evt_ch_setup_refused_t. */ -+ BLE_L2CAP_EVT_CH_SETUP, /**< L2CAP Channel Setup Completed event. -+ \n See @ref ble_l2cap_evt_ch_setup_t. */ -+ BLE_L2CAP_EVT_CH_RELEASED, /**< L2CAP Channel Released event. -+ \n No additional event structure applies. */ -+ BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED, /**< L2CAP Channel SDU data buffer released event. -+ \n See @ref ble_l2cap_evt_ch_sdu_buf_released_t. */ -+ BLE_L2CAP_EVT_CH_CREDIT, /**< L2CAP Channel Credit received. -+ \n See @ref ble_l2cap_evt_ch_credit_t. */ -+ BLE_L2CAP_EVT_CH_RX, /**< L2CAP Channel SDU received. -+ \n See @ref ble_l2cap_evt_ch_rx_t. */ -+ BLE_L2CAP_EVT_CH_TX, /**< L2CAP Channel SDU transmitted. -+ \n See @ref ble_l2cap_evt_ch_tx_t. */ -+}; -+ -+/** @} */ -+ - /**@addtogroup BLE_L2CAP_DEFINES Defines - * @{ */ - -+/**@brief Maximum number of L2CAP channels per connection. */ -+#define BLE_L2CAP_CH_COUNT_MAX (64) -+ -+/**@brief Minimum L2CAP MTU, in bytes. */ -+#define BLE_L2CAP_MTU_MIN (23) -+ -+/**@brief Minimum L2CAP MPS, in bytes. */ -+#define BLE_L2CAP_MPS_MIN (23) -+ -+/**@brief Invalid CID. */ -+#define BLE_L2CAP_CID_INVALID (0x0000) -+ -+/**@brief Default number of credits for @ref sd_ble_l2cap_ch_flow_control. */ -+#define BLE_L2CAP_CREDITS_DEFAULT (1) -+ -+/**@defgroup BLE_L2CAP_CH_SETUP_REFUSED_SRCS L2CAP channel setup refused sources -+ * @{ */ -+#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_LOCAL (0x01) /**< Local. */ -+#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_REMOTE (0x02) /**< Remote. */ -+ /** @} */ -+ -+ /** @defgroup BLE_L2CAP_CH_STATUS_CODES L2CAP channel status codes -+ * @{ */ -+#define BLE_L2CAP_CH_STATUS_CODE_SUCCESS (0x0000) /**< Success. */ -+#define BLE_L2CAP_CH_STATUS_CODE_LE_PSM_NOT_SUPPORTED (0x0002) /**< LE_PSM not supported. */ -+#define BLE_L2CAP_CH_STATUS_CODE_NO_RESOURCES (0x0004) /**< No resources available. */ -+#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHENTICATION (0x0005) /**< Insufficient authentication. */ -+#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHORIZATION (0x0006) /**< Insufficient authorization. */ -+#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC_KEY_SIZE (0x0007) /**< Insufficient encryption key size. */ -+#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC (0x0008) /**< Insufficient encryption. */ -+#define BLE_L2CAP_CH_STATUS_CODE_INVALID_SCID (0x0009) /**< Invalid Source CID. */ -+#define BLE_L2CAP_CH_STATUS_CODE_SCID_ALLOCATED (0x000A) /**< Source CID already allocated. */ -+#define BLE_L2CAP_CH_STATUS_CODE_UNACCEPTABLE_PARAMS (0x000B) /**< Unacceptable parameters. */ -+#define BLE_L2CAP_CH_STATUS_CODE_NOT_UNDERSTOOD (0x8000) /**< Command Reject received instead of LE Credit Based Connection Response. */ -+#define BLE_L2CAP_CH_STATUS_CODE_TIMEOUT (0xC000) /**< Operation timed out. */ -+/** @} */ -+ -+/** @} */ -+ -+/**@addtogroup BLE_L2CAP_STRUCTURES Structures -+ * @{ */ -+ -+/** -+ * @brief BLE L2CAP connection configuration parameters, set with @ref sd_ble_cfg_set. -+ * -+ * @note These parameters are set per connection, so all L2CAP channels created on this connection -+ * will have the same parameters. -+ * -+ * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: -+ * - rx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. -+ * - tx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. -+ * - ch_count is greater than @ref BLE_L2CAP_CH_COUNT_MAX. -+ * @retval ::NRF_ERROR_NO_MEM rx_mps or tx_mps is set too high. -+ */ -+typedef struct -+{ -+ uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall -+ be able to receive on L2CAP channels on connections with this -+ configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ -+ uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall -+ be able to transmit on L2CAP channels on connections with this -+ configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ -+ uint8_t rx_queue_size; /**< Number of SDU data buffers that can be queued for reception per -+ L2CAP channel. The minimum value is one. */ -+ uint8_t tx_queue_size; /**< Number of SDU data buffers that can be queued for transmission -+ per L2CAP channel. The minimum value is one. */ -+ uint8_t ch_count; /**< Number of L2CAP channels the application can create per connection -+ with this configuration. The default value is zero, the maximum -+ value is @ref BLE_L2CAP_CH_COUNT_MAX. -+ @note if this parameter is set to zero, all other parameters in -+ @ref ble_l2cap_conn_cfg_t are ignored. */ -+} ble_l2cap_conn_cfg_t; -+ -+/**@brief L2CAP channel RX parameters. */ -+typedef struct -+{ -+ uint16_t rx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP shall be able to -+ receive on this L2CAP channel. -+ - Must be equal to or greater than @ref BLE_L2CAP_MTU_MIN. */ -+ uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall be -+ able to receive on this L2CAP channel. -+ - Must be equal to or greater than @ref BLE_L2CAP_MPS_MIN. -+ - Must be equal to or less than @ref ble_l2cap_conn_cfg_t::rx_mps. */ -+ ble_data_t sdu_buf; /**< SDU data buffer for reception. -+ - If @ref ble_data_t::p_data is non-NULL, initial credits are -+ issued to the peer. -+ - If @ref ble_data_t::p_data is NULL, no initial credits are -+ issued to the peer. */ -+} ble_l2cap_ch_rx_params_t; -+ -+/**@brief L2CAP channel setup parameters. */ -+typedef struct -+{ -+ ble_l2cap_ch_rx_params_t rx_params; /**< L2CAP channel RX parameters. */ -+ uint16_t le_psm; /**< LE Protocol/Service Multiplexer. Used when requesting -+ setup of an L2CAP channel, ignored otherwise. */ -+ uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES. -+ Used when replying to a setup request of an L2CAP -+ channel, ignored otherwise. */ -+} ble_l2cap_ch_setup_params_t; -+ -+/**@brief L2CAP channel TX parameters. */ -+typedef struct -+{ -+ uint16_t tx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP is able to -+ transmit on this L2CAP channel. */ -+ uint16_t peer_mps; /**< The maximum L2CAP PDU payload size, in bytes, that the peer is -+ able to receive on this L2CAP channel. */ -+ uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP is able -+ to transmit on this L2CAP channel. This is effective tx_mps, -+ selected by the SoftDevice as -+ MIN( @ref ble_l2cap_ch_tx_params_t::peer_mps, @ref ble_l2cap_conn_cfg_t::tx_mps ) */ -+ uint16_t credits; /**< Initial credits given by the peer. */ -+} ble_l2cap_ch_tx_params_t; -+ -+/**@brief L2CAP Channel Setup Request event. */ -+typedef struct -+{ -+ ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ -+ uint16_t le_psm; /**< LE Protocol/Service Multiplexer. */ -+} ble_l2cap_evt_ch_setup_request_t; -+ -+/**@brief L2CAP Channel Setup Refused event. */ -+typedef struct -+{ -+ uint8_t source; /**< Source, see @ref BLE_L2CAP_CH_SETUP_REFUSED_SRCS */ -+ uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES */ -+} ble_l2cap_evt_ch_setup_refused_t; -+ -+/**@brief L2CAP Channel Setup Completed event. */ -+typedef struct -+{ -+ ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ -+} ble_l2cap_evt_ch_setup_t; -+ -+/**@brief L2CAP Channel SDU Data Duffer Released event. */ -+typedef struct -+{ -+ ble_data_t sdu_buf; /**< Returned reception or transmission SDU data buffer. The SoftDevice -+ returns SDU data buffers supplied by the application, which have -+ not yet been returned previously via a @ref BLE_L2CAP_EVT_CH_RX or -+ @ref BLE_L2CAP_EVT_CH_TX event. */ -+} ble_l2cap_evt_ch_sdu_buf_released_t; -+ -+/**@brief L2CAP Channel Credit received event. */ -+typedef struct -+{ -+ uint16_t credits; /**< Additional credits given by the peer. */ -+} ble_l2cap_evt_ch_credit_t; -+ -+/**@brief L2CAP Channel received SDU event. */ -+typedef struct -+{ -+ uint16_t sdu_len; /**< Total SDU length, in bytes. */ -+ ble_data_t sdu_buf; /**< SDU data buffer. -+ @note If there is not enough space in the buffer -+ (sdu_buf.len < sdu_len) then the rest of the SDU will be -+ silently discarded by the SoftDevice. */ -+} ble_l2cap_evt_ch_rx_t; -+ -+/**@brief L2CAP Channel transmitted SDU event. */ -+typedef struct -+{ -+ ble_data_t sdu_buf; /**< SDU data buffer. */ -+} ble_l2cap_evt_ch_tx_t; -+ -+/**@brief L2CAP event structure. */ -+typedef struct -+{ -+ uint16_t conn_handle; /**< Connection Handle on which the event occured. */ -+ uint16_t local_cid; /**< Local Channel ID of the L2CAP channel, or -+ @ref BLE_L2CAP_CID_INVALID if not present. */ -+ union -+ { -+ ble_l2cap_evt_ch_setup_request_t ch_setup_request; /**< L2CAP Channel Setup Request Event Parameters. */ -+ ble_l2cap_evt_ch_setup_refused_t ch_setup_refused; /**< L2CAP Channel Setup Refused Event Parameters. */ -+ ble_l2cap_evt_ch_setup_t ch_setup; /**< L2CAP Channel Setup Completed Event Parameters. */ -+ ble_l2cap_evt_ch_sdu_buf_released_t ch_sdu_buf_released;/**< L2CAP Channel SDU Data Buffer Released Event Parameters. */ -+ ble_l2cap_evt_ch_credit_t credit; /**< L2CAP Channel Credit Received Event Parameters. */ -+ ble_l2cap_evt_ch_rx_t rx; /**< L2CAP Channel SDU Received Event Parameters. */ -+ ble_l2cap_evt_ch_tx_t tx; /**< L2CAP Channel SDU Transmitted Event Parameters. */ -+ } params; /**< Event Parameters. */ -+} ble_l2cap_evt_t; -+ -+/** @} */ -+ -+/**@addtogroup BLE_L2CAP_FUNCTIONS Functions -+ * @{ */ -+ -+/**@brief Set up an L2CAP channel. -+ * -+ * @details This function is used to: -+ * - Request setup of an L2CAP channel: sends an LE Credit Based Connection Request packet to a peer. -+ * - Reply to a setup request of an L2CAP channel (if called in response to a -+ * @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST event): sends an LE Credit Based Connection -+ * Response packet to a peer. -+ * -+ * @note A call to this function will require the application to keep the SDU data buffer alive -+ * until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX or -+ * @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. -+ * -+ * @events -+ * @event{@ref BLE_L2CAP_EVT_CH_SETUP, Setup successful.} -+ * @event{@ref BLE_L2CAP_EVT_CH_SETUP_REFUSED, Setup failed.} -+ * @endevents -+ * -+ * @mscs -+ * @mmsc{@ref BLE_L2CAP_CH_SETUP_MSC} -+ * @endmscs -+ * -+ * @param[in] conn_handle Connection Handle. -+ * @param[in,out] p_local_cid Pointer to a uint16_t containing Local Channel ID of the L2CAP channel: -+ * - As input: @ref BLE_L2CAP_CID_INVALID when requesting setup of an L2CAP -+ * channel or local_cid provided in the @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST -+ * event when replying to a setup request of an L2CAP channel. -+ * - As output: local_cid for this channel. -+ * @param[in] p_params L2CAP channel parameters. -+ * -+ * @retval ::NRF_SUCCESS Successfully queued request or response for transmission. -+ * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. -+ * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. -+ * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. -+ * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. -+ * @retval ::NRF_ERROR_INVALID_LENGTH Supplied higher rx_mps than has been configured on this link. -+ * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (L2CAP channel already set up). -+ * @retval ::NRF_ERROR_NOT_FOUND CID not found. -+ * @retval ::NRF_ERROR_RESOURCES The limit has been reached for available L2CAP channels, -+ * see @ref ble_l2cap_conn_cfg_t::ch_count. -+ */ -+SVCALL(SD_BLE_L2CAP_CH_SETUP, uint32_t, sd_ble_l2cap_ch_setup(uint16_t conn_handle, uint16_t *p_local_cid, ble_l2cap_ch_setup_params_t const *p_params)); -+ -+/**@brief Release an L2CAP channel. -+ * -+ * @details This sends a Disconnection Request packet to a peer. -+ * -+ * @events -+ * @event{@ref BLE_L2CAP_EVT_CH_RELEASED, Release complete.} -+ * @endevents -+ * -+ * @mscs -+ * @mmsc{@ref BLE_L2CAP_CH_RELEASE_MSC} -+ * @endmscs -+ * -+ * @param[in] conn_handle Connection Handle. -+ * @param[in] local_cid Local Channel ID of the L2CAP channel. -+ * -+ * @retval ::NRF_SUCCESS Successfully queued request for transmission. -+ * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. -+ * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is -+ * in progress for the L2CAP channel). -+ * @retval ::NRF_ERROR_NOT_FOUND CID not found. -+ */ -+SVCALL(SD_BLE_L2CAP_CH_RELEASE, uint32_t, sd_ble_l2cap_ch_release(uint16_t conn_handle, uint16_t local_cid)); -+ -+/**@brief Receive an SDU on an L2CAP channel. -+ * -+ * @details This may issue additional credits to the peer using an LE Flow Control Credit packet. -+ * -+ * @note A call to this function will require the application to keep the memory pointed by -+ * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX -+ * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. -+ * -+ * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::rx_queue_size SDU data buffers -+ * for reception per L2CAP channel. -+ * -+ * @events -+ * @event{@ref BLE_L2CAP_EVT_CH_RX, The SDU is received.} -+ * @endevents -+ * -+ * @mscs -+ * @mmsc{@ref BLE_L2CAP_CH_RX_MSC} -+ * @endmscs -+ * -+ * @param[in] conn_handle Connection Handle. -+ * @param[in] local_cid Local Channel ID of the L2CAP channel. -+ * @param[in] p_sdu_buf Pointer to the SDU data buffer. -+ * -+ * @retval ::NRF_SUCCESS Buffer accepted. -+ * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. -+ * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. -+ * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is -+ * in progress for an L2CAP channel). -+ * @retval ::NRF_ERROR_NOT_FOUND CID not found. -+ * @retval ::NRF_ERROR_RESOURCES Too many SDU data buffers supplied. Wait for a -+ * @ref BLE_L2CAP_EVT_CH_RX event and retry. -+ */ -+SVCALL(SD_BLE_L2CAP_CH_RX, uint32_t, sd_ble_l2cap_ch_rx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); -+ -+/**@brief Transmit an SDU on an L2CAP channel. -+ * -+ * @note A call to this function will require the application to keep the memory pointed by -+ * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_TX -+ * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. -+ * -+ * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::tx_queue_size SDUs for -+ * transmission per L2CAP channel. -+ * -+ * @note The application can keep track of the available credits for transmission by following -+ * the procedure below: -+ * - Store initial credits given by the peer in a variable. -+ * (Initial credits are provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) -+ * - Decrement the variable, which stores the currently available credits, by -+ * ceiling((@ref ble_data_t::len + 2) / tx_mps) when a call to this function returns -+ * @ref NRF_SUCCESS. (tx_mps is provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) -+ * - Increment the variable, which stores the currently available credits, by additional -+ * credits given by the peer in a @ref BLE_L2CAP_EVT_CH_CREDIT event. -+ * -+ * @events -+ * @event{@ref BLE_L2CAP_EVT_CH_TX, The SDU is transmitted.} -+ * @endevents -+ * -+ * @mscs -+ * @mmsc{@ref BLE_L2CAP_CH_TX_MSC} -+ * @endmscs -+ * -+ * @param[in] conn_handle Connection Handle. -+ * @param[in] local_cid Local Channel ID of the L2CAP channel. -+ * @param[in] p_sdu_buf Pointer to the SDU data buffer. -+ * -+ * @retval ::NRF_SUCCESS Successfully queued L2CAP SDU for transmission. -+ * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. -+ * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. -+ * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is -+ * in progress for the L2CAP channel). -+ * @retval ::NRF_ERROR_NOT_FOUND CID not found. -+ * @retval ::NRF_ERROR_DATA_SIZE Invalid SDU length supplied, must not be more than -+ * @ref ble_l2cap_ch_tx_params_t::tx_mtu provided in -+ * @ref BLE_L2CAP_EVT_CH_SETUP event. -+ * @retval ::NRF_ERROR_RESOURCES Too many SDUs queued for transmission. Wait for a -+ * @ref BLE_L2CAP_EVT_CH_TX event and retry. -+ */ -+SVCALL(SD_BLE_L2CAP_CH_TX, uint32_t, sd_ble_l2cap_ch_tx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); -+ -+/**@brief Advanced SDU reception flow control. -+ * -+ * @details Adjust the way the SoftDevice issues credits to the peer. -+ * This may issue additional credits to the peer using an LE Flow Control Credit packet. -+ * -+ * @mscs -+ * @mmsc{@ref BLE_L2CAP_CH_FLOW_CONTROL_MSC} -+ * @endmscs -+ * -+ * @param[in] conn_handle Connection Handle. -+ * @param[in] local_cid Local Channel ID of the L2CAP channel or @ref BLE_L2CAP_CID_INVALID to set -+ * the value that will be used for newly created channels. -+ * @param[in] credits Number of credits that the SoftDevice will make sure the peer has every -+ * time it starts using a new reception buffer. -+ * - @ref BLE_L2CAP_CREDITS_DEFAULT is the default value the SoftDevice will -+ * use if this function is not called. -+ * - If set to zero, the SoftDevice will stop issuing credits for new reception -+ * buffers the application provides or has provided. SDU reception that is -+ * currently ongoing will be allowed to complete. -+ * @param[out] p_credits NULL or pointer to a uint16_t. If a valid pointer is provided, it will be -+ * written by the SoftDevice with the number of credits that is or will be -+ * available to the peer. If the value written by the SoftDevice is 0 when -+ * credits parameter was set to 0, the peer will not be able to send more -+ * data until more credits are provided by calling this function again with -+ * credits > 0. This parameter is ignored when local_cid is set to @ref -+ * BLE_L2CAP_CID_INVALID. -+ * -+ * @note Application should take care when setting number of credits higher than default value. In -+ * this case the application must make sure that the SoftDevice always has reception buffers -+ * available (see @ref sd_ble_l2cap_ch_rx) for that channel. If the SoftDevice does not have -+ * such buffers available, packets may be NACKed on the Link Layer and all Bluetooth traffic -+ * on the connection handle may be stalled until the SoftDevice again has an available -+ * reception buffer. This applies even if the application has used this call to set the -+ * credits back to default, or zero. -+ * -+ * @retval ::NRF_SUCCESS Flow control parameters accepted. -+ * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. -+ * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. -+ * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is -+ * in progress for an L2CAP channel). -+ * @retval ::NRF_ERROR_NOT_FOUND CID not found. -+ */ -+SVCALL(SD_BLE_L2CAP_CH_FLOW_CONTROL, uint32_t, sd_ble_l2cap_ch_flow_control(uint16_t conn_handle, uint16_t local_cid, uint16_t credits, uint16_t *p_credits)); -+ - - -//| -//| Data buffer provided to/from the application -//| -+/**@brief Data structure. */ -+typedef struct -+{ -+ uint8_t *p_data; /**< Pointer to the data buffer provided to/from the application. */ -+ uint16_t len; /**< Length of the data buffer, in bytes. */ -+} ble_data_t; -+ - - - -|-----------------------------------------------------------------------------| -| Network Privacy | -|-----------------------------------------------------------------------------| - -//| -//| Now supporting both network privacy and device privacy. -//| - #define BLE_GAP_PRIVACY_MODE_OFF 0x00 /**< Device will send and accept its identity address for its own address. */ - #define BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY 0x01 /**< Device will send and accept only private addresses for its own address. */ -+#define BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY 0x02 /**< Device will send and accept only private addresses for its own address, -+ and will not accept a peer using identity address as sender address when -+ the peer IRK is exchanged, non-zero and added to the identity list. */ - - --/**@brief Device Privacy. -+/**@brief Privacy. - * - * The privacy feature provides a way for the device to avoid being tracked over a period of time. - * The privacy feature, when enabled, hides the local device identity and replaces it with a private address - * that is automatically refreshed at a specified interval. - * - * If a device still wants to be recognized by other peers, it needs to share it's Identity Resolving Key (IRK). - * With this key, a device can generate a random private address that can only be recognized by peers in possession of that key, - * and devices can establish connections without revealing their real identities. - * -+ * Both network privacy (@ref BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY) and device privacy (@ref BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY) -+ * are supported. -+ * - * @note If the device IRK is updated, the new IRK becomes the one to be distributed in all - * bonding procedures performed after @ref sd_ble_gap_privacy_set returns. - * The IRK distributed during bonding procedure is the device IRK that is active when @ref sd_ble_gap_sec_params_reply is called. - */ - typedef struct - { - uint8_t privacy_mode; /**< Privacy mode, see @ref BLE_GAP_PRIVACY_MODES. Default is @ref BLE_GAP_PRIVACY_MODE_OFF. */ - uint8_t private_addr_type; /**< The private address type must be either @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE or @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE. */ - uint16_t private_addr_cycle_s; /**< Private address cycle interval in seconds. Providing an address cycle value of 0 will use the default value defined by @ref BLE_GAP_DEFAULT_PRIVATE_ADDR_CYCLE_INTERVAL_S. */ - ble_gap_irk_t *p_device_irk; /**< When used as input, pointer to IRK structure that will be used as the default IRK. If NULL, the device default IRK will be used. - When used as output, pointer to IRK structure where the current default IRK will be written to. If NULL, this argument is ignored. - By default, the default IRK is used to generate random private resolvable addresses for the local device unless instructed otherwise. */ - } ble_gap_privacy_params_t; - -+#define BLE_UUID_GAP_CHARACTERISTIC_RPA_ONLY 0x2AC9 /**< Resolvable Private Address Only Characteristic. */ - - -//| -//| Improved documentation for sd_ble_gap_privacy_get -//| - /**@brief Get privacy settings. - * -- * @note The privacy settings returned include the current device irk as well. -+ * @note ::ble_gap_privacy_params_t::p_device_irk must be initialized to NULL or a valid address before this function is called. -+ * If it is initialized to a valid address, the address pointed to will contain the current device IRK on return. - * -- * @param[in] p_privacy_params Privacy settings. -+ * @param[in,out] p_privacy_params Privacy settings. - * - * @retval ::NRF_SUCCESS Privacy settings read. - * @retval ::NRF_ERROR_INVALID_ADDR The pointer given for returning the privacy settings may be NULL or invalid. - * Otherwise, the p_device_irk pointer in privacy parameter is an invalid pointer. - */ - SVCALL(SD_BLE_GAP_PRIVACY_GET, uint32_t, sd_ble_gap_privacy_get(ble_gap_privacy_params_t *p_privacy_params)); - -|-----------------------------------------------------------------------------| -| Updates for Bluetooth 5 compliance | -|-----------------------------------------------------------------------------| - -//| -//| BLE_GAP_EVT_TIMEOUT {src: BLE_GAP_TIMEOUT_SRC_SECURITY_REQUEST} replaced with BLE_GAP_EVT_AUTH_STATUS {auth_status: BLE_GAP_SEC_STATUS_TIMEOUT} -//| - /**@defgroup BLE_GAP_TIMEOUT_SOURCES GAP Timeout sources - * @{ */ - #define BLE_GAP_TIMEOUT_SRC_ADVERTISING 0x00 /**< Advertising timeout. */ --#define BLE_GAP_TIMEOUT_SRC_SECURITY_REQUEST 0x01 /**< Security request timeout. */ --#define BLE_GAP_TIMEOUT_SRC_SCAN 0x02 /**< Scanning timeout. */ --#define BLE_GAP_TIMEOUT_SRC_CONN 0x03 /**< Connection timeout. */ --#define BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD 0x04 /**< Authenticated payload timeout. */ -+#define BLE_GAP_TIMEOUT_SRC_SCAN 0x01 /**< Scanning timeout. */ -+#define BLE_GAP_TIMEOUT_SRC_CONN 0x02 /**< Connection timeout. */ -+#define BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD 0x03 /**< Authenticated payload timeout. */ - /**@} */ - - -//| -//| Lowering of the lower limit for advertising interval for non-connectable advertisement. -//| - /**@defgroup BLE_GAP_ADV_INTERVALS GAP Advertising interval max and min - * @{ */ - #define BLE_GAP_ADV_INTERVAL_MIN 0x0020 /**< Minimum Advertising interval in 625 us units, i.e. 20 ms. */ --#define BLE_GAP_ADV_NONCON_INTERVAL_MIN 0x00A0 /**< Minimum Advertising interval in 625 us units for non connectable mode, i.e. 100 ms. */ - #define BLE_GAP_ADV_INTERVAL_MAX 0x4000 /**< Maximum Advertising interval in 625 us units, i.e. 10.24 s. */ - /**@} */ - - -//| -//| Change of definition of LE Security Mode 1 level 4. -//| - /**@brief GAP connection security modes. - * - * Security Mode 0 Level 0: No access permissions at all (this level is not defined by the Bluetooth Core specification).\n - * Security Mode 1 Level 1: No security is needed (aka open link).\n - * Security Mode 1 Level 2: Encrypted link required, MITM protection not necessary.\n - * Security Mode 1 Level 3: MITM protected encrypted link required.\n -- * Security Mode 1 Level 4: LESC MITM protected encrypted link required.\n -+ * Security Mode 1 Level 4: LESC MITM protected encrypted link using a 128-bit strength encryption key required.\n - * Security Mode 2 Level 1: Signing or encryption required, MITM protection not necessary.\n - * Security Mode 2 Level 2: MITM protected signing required, unless link is MITM protected encrypted.\n - */ - typedef struct - { - uint8_t sm : 4; /**< Security Mode (1 or 2), 0 for no permissions at all. */ - uint8_t lv : 4; /**< Level (1, 2, 3 or 4), 0 for no permissions at all. */ - - } ble_gap_conn_sec_mode_t; - -|-----------------------------------------------------------------------------| -| Master boot record | -|-----------------------------------------------------------------------------| - - -//| -//| New API for forwarding all interrupts to a specific address -//| - enum NRF_MBR_COMMANDS - { - SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see sd_mbr_command_copy_bl_t*/ - SD_MBR_COMMAND_COPY_SD, /**< Copy a new SoftDevice. @see ::sd_mbr_command_copy_sd_t*/ - SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD*/ - SD_MBR_COMMAND_COMPARE, /**< This command works like memcmp. @see ::sd_mbr_command_compare_t*/ -- SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Start forwarding all exception to this address @see ::sd_mbr_command_vector_table_base_set_t*/ -+ SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Change the address the MBR starts after a reset @see ::sd_mbr_command_vector_table_base_set_t*/ -+ SD_MBR_COMMAND_RESERVED, -+ SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET, /**< Start forwarding all interrupts to this address @see ::sd_mbr_command_irq_forward_address_set_t*/ - }; - -+/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the MBR -+ * Unlike sd_mbr_command_vector_table_base_set_t, this function does not reset, and it does not -+ * change where the MBR starts after reset. -+ * -+ * @retval ::NRF_SUCCESS -+ */ -+typedef struct -+{ -+ uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ -+} sd_mbr_command_irq_forward_address_set_t; - - typedef struct - { - uint32_t command; /**< type of command to be issued see @ref NRF_MBR_COMMANDS. */ - union - { - sd_mbr_command_copy_sd_t copy_sd; /**< Parameters for copy SoftDevice.*/ - sd_mbr_command_compare_t compare; /**< Parameters for verify.*/ - sd_mbr_command_copy_bl_t copy_bl; /**< Parameters for copy BootLoader. Requires parameter page. */ - sd_mbr_command_vector_table_base_set_t base_set; /**< Parameters for vector table base set. Requires parameter page.*/ -+ sd_mbr_command_irq_forward_address_set_t irq_forward_address_set; /**< Parameters for irq forward address set*/ - } params; - } sd_mbr_command_t; - - -|-----------------------------------------------------------------------------| -| Removal of Compatibility mode 2 option | -|-----------------------------------------------------------------------------| - - enum BLE_GAP_OPTS - { - BLE_GAP_OPT_CH_MAP = BLE_GAP_OPT_BASE, /**< Channel Map. @ref ble_gap_opt_ch_map_t */ - BLE_GAP_OPT_LOCAL_CONN_LATENCY, /**< Local connection latency. @ref ble_gap_opt_local_conn_latency_t */ - BLE_GAP_OPT_PASSKEY, /**< Set passkey. @ref ble_gap_opt_passkey_t */ - BLE_GAP_OPT_SCAN_REQ_REPORT, /**< Scan request report. @ref ble_gap_opt_scan_req_report_t */ - BLE_GAP_OPT_COMPAT_MODE_1, /**< Compatibility mode. @ref ble_gap_opt_compat_mode_1_t */ -- BLE_GAP_OPT_COMPAT_MODE_2, /**< Compatibility mode. @ref ble_gap_opt_compat_mode_2_t */ - BLE_GAP_OPT_AUTH_PAYLOAD_TIMEOUT, /**< Set Authenticated payload timeout. @ref ble_gap_opt_auth_payload_timeout_t */ - BLE_GAP_OPT_SLAVE_LATENCY_DISABLE, /**< Disable slave latency. @ref ble_gap_opt_slave_latency_disable_t */ - }; - - --/**@brief Compatibility mode 2 option. -- * -- * This can be used with @ref sd_ble_opt_set to enable compatibility mode 2. -- * Compatibility mode 2 is disabled by default. -- * -- * @note Compatibility mode 2 enables interoperability with devices that initiate Feature exchange -- * and version exchange procedure in parallel. -- * -- * @retval ::NRF_SUCCESS Set successfully. -- * @retval ::NRF_ERROR_INVALID_PARAM if enable bit is not set to 1. Currently only enabling is supported. -- * @retval ::NRF_ERROR_INVALID_STATE When any role is running while mode 2 is set. -- */ --typedef struct --{ -- uint8_t enable : 1; /**< Enable compatibility mode 2.*/ --} ble_gap_opt_compat_mode_2_t; -- -- - - - /**@brief Option structure for GAP options. */ - typedef union - { - ble_gap_opt_ch_map_t ch_map; /**< Parameters for the Channel Map option. */ - ble_gap_opt_local_conn_latency_t local_conn_latency; /**< Parameters for the Local connection latency option */ - ble_gap_opt_passkey_t passkey; /**< Parameters for the Passkey option.*/ - ble_gap_opt_scan_req_report_t scan_req_report; /**< Parameters for the scan request report option.*/ - ble_gap_opt_compat_mode_1_t compat_mode_1; /**< Parameters for the compatibility mode 1 option.*/ -- ble_gap_opt_compat_mode_2_t compat_mode_2; /**< Parameters for the compatibility mode 2 option.*/ - ble_gap_opt_auth_payload_timeout_t auth_payload_timeout; /**< Parameters for the authenticated payload timeout option.*/ - ble_gap_opt_slave_latency_disable_t slave_latency_disable; /**< Parameters for the Disable slave latency option */ - } ble_gap_opt_t; - /**@} */ - - - -|-----------------------------------------------------------------------------| -| Misc | -|-----------------------------------------------------------------------------| - - -//| -//| Added defines for Authenticated payload timeout -//| -+/**@defgroup BLE_GAP_AUTH_PAYLOAD_TIMEOUT Authenticated payload timeout defines. -+ * @{ */ -+#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX (48000) /**< Maximum authenticated payload timeout in 10 ms units, i.e. 8 minutes. */ -+#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MIN (1) /**< Minimum authenticated payload timeout in 10 ms units, i.e. 10 ms. */ -+/**@} */ - - /**@brief Authenticated payload timeout option. - * -- * This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other than the default of 8 minutes. -+ * This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other -+ * than the default of @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX. - * - * @note The authenticated payload timeout event ::BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD will be generated - * if auth_payload_timeout time has elapsed without receiving a packet with a valid MIC on an encrypted - * link. - * - * @note The LE ping procedure will be initiated before the timer expires to give the peer a chance - * to reset the timer. In addition the stack will try to prioritize running of LE ping over other - * activities to increase chances of finishing LE ping before timer expires. To avoid side-effects - * on other activities, it is recommended to use high timeout values. - * Recommended timeout > 2*(connInterval * (6 + connSlaveLatency)). - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. auth_payload_timeout was outside of allowed range. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. - */ - typedef struct - { - uint16_t conn_handle; /**< Connection Handle */ -- uint16_t auth_payload_timeout; /**< Requested timeout in 10 ms unit. Maximum is 48 000 (=480 000 ms =8 min). Minimum is 1 (=10 ms). */ -+ uint16_t auth_payload_timeout; /**< Requested timeout in 10 ms unit, see @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT. */ - } ble_gap_opt_auth_payload_timeout_t; - - -//| -//| APIs not returning NRF_ERROR_BUSY anymore. -//| - /**@brief Start advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). - * - * @note Only one advertiser may be active at any time. - * - * @param[in] p_adv_params Pointer to advertising parameters structure. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or @ref - * BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. If - * @ref ble_gap_adv_params_t::type is @ref BLE_GAP_ADV_TYPE_ADV_NONCONN_IND, - * this is ignored. - * - * @retval ::NRF_SUCCESS The BLE stack has started advertising. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached; connectable advertiser cannot be started. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check the accepted ranges and limits. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Bluetooth address supplied. - * @retval ::BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST Discoverable mode and whitelist incompatible. -- * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Observer) and try again - */ - SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(ble_gap_adv_params_t const *p_adv_params, uint8_t conn_cfg_tag)); - - - /**@brief Initiate the GAP Authentication procedure. - * - * @details In the central role, this function will send an SMP Pairing Request (or an SMP Pairing Failed if rejected), - * otherwise in the peripheral role, an SMP Security Request will be sent. - * - * @param[in] conn_handle Connection handle. - * @param[in] p_sec_params Pointer to the @ref ble_gap_sec_params_t structure with the security parameters to be used during the pairing or bonding procedure. - * In the peripheral role, only the bond, mitm, lesc and keypress fields of this structure are used. - * In the central role, this pointer may be NULL to reject a Security Request. - * - * @retval ::NRF_SUCCESS Successfully initiated authentication procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. -- * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_NO_MEM The maximum number of authentication procedures that can run in parallel for the given role is reached. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Setting of sign or link fields in @ref ble_gap_sec_kdist_t not supported. - * @retval ::NRF_ERROR_TIMEOUT A SMP timeout has occurred, and further SMP operations on this link is prohibited. - */ - SVCALL(SD_BLE_GAP_AUTHENTICATE, uint32_t, sd_ble_gap_authenticate(uint16_t conn_handle, ble_gap_sec_params_t const *p_sec_params)); - - - /**@brief Start scanning (GAP Discovery procedure, Observer Procedure). - * - * @param[in] p_scan_params Pointer to scan parameters structure. - * - * @retval ::NRF_SUCCESS Successfully initiated scanning procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. -- * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again - */ - SVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_params_t const *p_scan_params)); - - - /**@brief Create a connection (GAP Link Establishment). - * - * @note If a scanning procedure is currently in progress it will be automatically stopped when calling this function. - * The scanning procedure will be stopped even if the function returns an error. - * - * @param[in] p_peer_addr Pointer to peer address. If the use_whitelist bit is set in @ref ble_gap_scan_params_t, then this is ignored. -- * If @ref ble_gap_addr_t::addr_id_peer is set then p_peer_addr must be present in the device identity list -- * see @ref sd_ble_gap_device_identities_set. - * @param[in] p_scan_params Pointer to scan parameters structure. - * @param[in] p_conn_params Pointer to desired connection parameters. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or @ref - * BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. - * - * @retval ::NRF_SUCCESS Successfully initiated connection procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid parameter(s) pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * - Invalid parameter(s) in p_scan_params or p_conn_params. - * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. - * - Peer address was not present in the device identity list, see @ref sd_ble_gap_device_identities_set. - * @retval ::NRF_ERROR_INVALID_STATE The SoftDevice is in an invalid state to perform this operation. This may be due to an - * existing locally initiated connect procedure, which must complete before initiating again. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Peer address. - * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached. -- * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. If another connection is being established -- * wait for the corresponding @ref BLE_GAP_EVT_CONNECTED event before calling again. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again - */ - SVCALL(SD_BLE_GAP_CONNECT, uint32_t, sd_ble_gap_connect(ble_gap_addr_t const *p_peer_addr, ble_gap_scan_params_t const *p_scan_params, ble_gap_conn_params_t const *p_conn_params, uint8_t conn_cfg_tag)); - - -//| -//| APIs now also returning NRF_ERROR_BUSY. -//| - - /**@brief Provide a user memory block. - * - * @note This call can only be used as a response to a @ref BLE_EVT_USER_MEM_REQUEST event issued to the application. - * - * @param[in] conn_handle Connection handle. - * @param[in] p_block Pointer to a user memory block structure or NULL if memory is managed by the application. - * - * @mscs -- * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_PEER_CANCEL_MSC} -+ * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Successfully queued a response to the peer. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. -+ * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid user memory block length supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection state or no user memory request pending. - */ - SVCALL(SD_BLE_USER_MEM_REPLY, uint32_t, sd_ble_user_mem_reply(uint16_t conn_handle, ble_user_mem_block_t const *p_block)); - - - /**@brief Reply with GAP security parameters. - * - * @details This function is only used to reply to a @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. - * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. - * - * @param[in] conn_handle Connection handle. - * @param[in] sec_status Security status, see @ref BLE_GAP_SEC_STATUS. - * @param[in] p_sec_params Pointer to a @ref ble_gap_sec_params_t security parameters structure. In the central role this must be set to NULL, as the parameters have - * already been provided during a previous call to @ref sd_ble_gap_authenticate. - * @param[in,out] p_sec_keyset Pointer to a @ref ble_gap_sec_keyset_t security keyset structure. Any keys generated and/or distributed as a result of the ongoing security procedure - * will be stored into the memory referenced by the pointers inside this structure. The keys will be stored and available to the application - * upon reception of a @ref BLE_GAP_EVT_AUTH_STATUS event. - * Note that the SoftDevice expects the application to provide memory for storing the - * peer's keys. So it must be ensured that the relevant pointers inside this structure are not NULL. The pointers to the local key - * can, however, be NULL, in which case, the local key data will not be available to the application upon reception of the - * @ref BLE_GAP_EVT_AUTH_STATUS event. - * - * @retval ::NRF_SUCCESS Successfully accepted security parameter from the application. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. -+ * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Setting of sign or link fields in @ref ble_gap_sec_kdist_t not supported. - */ - SVCALL(SD_BLE_GAP_SEC_PARAMS_REPLY, uint32_t, sd_ble_gap_sec_params_reply(uint16_t conn_handle, uint8_t sec_status, ble_gap_sec_params_t const *p_sec_params, ble_gap_sec_keyset_t const *p_sec_keyset)); - - - /**@brief Respond to a Read/Write authorization request. - * - * @note This call should only be used as a response to a @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event issued to the application. - * - * @mscs - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_READ_REQ_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_WRITE_REQ_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} -- * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_PEER_CANCEL_MSC} -+ * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_rw_authorize_reply_params Pointer to a structure with the attribute provided by the application. - * - * @note @ref ble_gatts_authorize_params_t::p_data is ignored when this function is used to respond - * to a @ref BLE_GATTS_AUTHORIZE_TYPE_READ event if @ref ble_gatts_authorize_params_t::update - * is set to 0. - * - * @retval ::NRF_SUCCESS Successfully queued a response to the peer, and in the case of a write operation, Attribute Table updated. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. -+ * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no authorization request pending. - * @retval ::NRF_ERROR_INVALID_PARAM Authorization op invalid, - * handle supplied does not match requested handle, - * or invalid data to be written provided by the application. - */ - SVCALL(SD_BLE_GATTS_RW_AUTHORIZE_REPLY, uint32_t, sd_ble_gatts_rw_authorize_reply(uint16_t conn_handle, ble_gatts_rw_authorize_reply_params_t const *p_rw_authorize_reply_params)); - - - -//| -//| Flag indicating the establishment of an LE Secure Connection -//| - typedef struct - { - uint8_t auth_status; /**< Authentication status, see @ref BLE_GAP_SEC_STATUS. */ - uint8_t error_src : 2; /**< On error, source that caused the failure, see @ref BLE_GAP_SEC_STATUS_SOURCES. */ - uint8_t bonded : 1; /**< Procedure resulted in a bond. */ -+ uint8_t lesc : 1; /**< Procedure resulted in a LE Secure Connection. */ - ble_gap_sec_levels_t sm1_levels; /**< Levels supported in Security Mode 1. */ - ble_gap_sec_levels_t sm2_levels; /**< Levels supported in Security Mode 2. */ - ble_gap_sec_kdist_t kdist_own; /**< Bitmap stating which keys were exchanged (distributed) by the local device. If bonding with LE Secure Connections, the enc bit will be always set. */ - ble_gap_sec_kdist_t kdist_peer; /**< Bitmap stating which keys were exchanged (distributed) by the remote device. If bonding with LE Secure Connections, the enc bit will never be set. */ - } ble_gap_evt_auth_status_t; - -//| -//| Stack will no longer return BUSY on sd_ble_gap_conn_param_update unless the procedure is already in progress. -//| - /**@brief Update connection parameters. - * - * @details In the central role this will initiate a Link Layer connection parameter update procedure, - * otherwise in the peripheral role, this will send the corresponding L2CAP request and wait for - * the central to perform the procedure. In both cases, and regardless of success or failure, the application - * will be informed of the result with a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE event. - * - * @details This function can be used as a central both to reply to a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST or to start the procedure unrequested. - * - * @param[in] conn_handle Connection handle. - * @param[in] p_conn_params Pointer to desired connection parameters. If NULL is provided on a peripheral role, - * the parameters in the PPCP characteristic of the GAP service will be used instead. - * If NULL is provided on a central role and in response to a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST, the peripheral request will be rejected - * - * @retval ::NRF_SUCCESS The Connection Update procedure has been started successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. -- * @retval ::NRF_ERROR_BUSY Procedure already in progress or not allowed at this time, process pending events and wait for pending procedures to complete and retry. -+ * @retval ::NRF_ERROR_BUSY Procedure already in progress, wait for pending procedures to complete and retry. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - */ - SVCALL(SD_BLE_GAP_CONN_PARAM_UPDATE, uint32_t, sd_ble_gap_conn_param_update(uint16_t conn_handle, ble_gap_conn_params_t const *p_conn_params)); - - -//| -//| Renamed Defines and structure member related to clock accuracy -//| --/**@defgroup NRF_CLOCK_LF_XTAL_ACCURACY Clock accuracy -+/**@defgroup NRF_CLOCK_LF_ACCURACY Clock accuracy - * @{ */ - --#define NRF_CLOCK_LF_XTAL_ACCURACY_250_PPM (0) /**< Default: 250 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_500_PPM (1) /**< 500 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_150_PPM (2) /**< 150 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_100_PPM (3) /**< 100 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_75_PPM (4) /**< 75 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_50_PPM (5) /**< 50 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_30_PPM (6) /**< 30 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_20_PPM (7) /**< 20 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_10_PPM (8) /**< 10 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_5_PPM (9) /**< 5 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_2_PPM (10) /**< 2 ppm */ --#define NRF_CLOCK_LF_XTAL_ACCURACY_1_PPM (11) /**< 1 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_250_PPM (0) /**< Default: 250 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_500_PPM (1) /**< 500 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_150_PPM (2) /**< 150 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_100_PPM (3) /**< 100 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_75_PPM (4) /**< 75 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_50_PPM (5) /**< 50 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_30_PPM (6) /**< 30 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_20_PPM (7) /**< 20 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_10_PPM (8) /**< 10 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_5_PPM (9) /**< 5 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_2_PPM (10) /**< 2 ppm */ -+#define NRF_CLOCK_LF_ACCURACY_1_PPM (11) /**< 1 ppm */ - - - /**@brief Type representing LFCLK oscillator source. */ - typedef struct - { - uint8_t source; /**< LF oscillator clock source, see @ref NRF_CLOCK_LF_SRC. */ - uint8_t rc_ctiv; /**< Only for NRF_CLOCK_LF_SRC_RC: Calibration timer interval in 1/4 second - units (nRF51: 1-64, nRF52: 1-32). - @note To avoid excessive clock drift, 0.5 degrees Celsius is the - maximum temperature change allowed in one calibration timer - interval. The interval should be selected to ensure this. - - @note Must be 0 if source is not NRF_CLOCK_LF_SRC_RC. */ - uint8_t rc_temp_ctiv; /**< Only for NRF_CLOCK_LF_SRC_RC: How often (in number of calibration - intervals) the RC oscillator shall be calibrated if the temperature - hasn't changed. - 0: Always calibrate even if the temperature hasn't changed. - 1: Only calibrate if the temperature has changed (nRF51 only). - 2-33: Check the temperature and only calibrate if it has changed, - however calibration will take place every rc_temp_ctiv - intervals in any case. - - @note Must be 0 if source is not NRF_CLOCK_LF_SRC_RC. - - @note For nRF52, the application must ensure calibration at least once - every 8 seconds to ensure +/-500 ppm clock stability. The - recommended configuration for NRF_CLOCK_LF_SRC_RC on nRF52 is - rc_ctiv=16 and rc_temp_ctiv=2. This will ensure calibration at - least once every 8 seconds and for temperature changes of 0.5 - degrees Celsius every 4 seconds. See the Product Specification - for the nRF52 device being used for more information.*/ -- uint8_t xtal_accuracy; /**< External crystal clock accuracy used in the LL to compute timing -- windows, see @ref NRF_CLOCK_LF_XTAL_ACCURACY. -- -- @note For the NRF_CLOCK_LF_SRC_RC clock source this parameter is ignored. */ -+ uint8_t accuracy; /**< External clock accuracy used in the LL to compute timing -+ windows, see @ref NRF_CLOCK_LF_ACCURACY.*/ - } nrf_clock_lf_cfg_t; - - -//| -//| Removal of references to nRF51 -//| --#ifdef NRF51 -- #define __NRF_NVIC_ISER_COUNT (1) /**< The number of ISER/ICER registers in the NVIC that are used. */ -- -- /**@brief Interrupts used by the SoftDevice. */ -- #define __NRF_NVIC_SD_IRQS_0 ((uint32_t)( \ -- (1U << POWER_CLOCK_IRQn) \ -- | (1U << RADIO_IRQn) \ -- | (1U << RTC0_IRQn) \ -- | (1U << TIMER0_IRQn) \ -- | (1U << RNG_IRQn) \ -- | (1U << ECB_IRQn) \ -- | (1U << CCM_AAR_IRQn) \ -- | (1U << TEMP_IRQn) \ -- | (1U << __NRF_NVIC_NVMC_IRQn) \ -- | (1U << (uint32_t)SWI5_IRQn) \ -- )) -- -- /**@brief Interrupts available for to application. */ -- #define __NRF_NVIC_APP_IRQS_0 (~__NRF_NVIC_SD_IRQS_0) --#endif -- --#ifdef NRF52 - #define __NRF_NVIC_ISER_COUNT (2) /**< The number of ISER/ICER registers in the NVIC that are used. */ - -- /**@brief Interrupts used by the SoftDevice. */ -+/**@brief Interrupts used by the SoftDevice, with IRQn in the range 0-31. */ - #define __NRF_NVIC_SD_IRQS_0 ((uint32_t)( \ - (1U << POWER_CLOCK_IRQn) \ - | (1U << RADIO_IRQn) \ - | (1U << RTC0_IRQn) \ - | (1U << TIMER0_IRQn) \ - | (1U << RNG_IRQn) \ - | (1U << ECB_IRQn) \ - | (1U << CCM_AAR_IRQn) \ - | (1U << TEMP_IRQn) \ - | (1U << __NRF_NVIC_NVMC_IRQn) \ - | (1U << (uint32_t)SWI5_EGU5_IRQn) \ - )) -+ -+/**@brief Interrupts used by the SoftDevice, with IRQn in the range 32-63. */ - #define __NRF_NVIC_SD_IRQS_1 ((uint32_t)0) - -- /**@brief Interrupts available for to application. */ -+/**@brief Interrupts available for to application, with IRQn in the range 0-31. */ - #define __NRF_NVIC_APP_IRQS_0 (~__NRF_NVIC_SD_IRQS_0) -+ -+/**@brief Interrupts available for to application, with IRQn in the range 32-63. */ - #define __NRF_NVIC_APP_IRQS_1 (~__NRF_NVIC_SD_IRQS_1) --#endif -+ - - __STATIC_INLINE uint32_t __sd_nvic_app_accessible_irq(IRQn_Type IRQn) - { - if (IRQn < 32) - { - return ((1UL<= (1 << __NVIC_PRIO_BITS)) - { - return 0; - } --#ifdef NRF51 -- if( priority == 0 -- || priority == 2 -- ) -- { -- return 0; -- } --#endif --#ifdef NRF52 - if( priority == 0 - || priority == 1 - || priority == 4 - ) - { - return 0; - } --#endif - return 1; - } - - __STATIC_INLINE uint32_t sd_nvic_critical_region_enter(uint8_t * p_is_nested_critical_region) - { - int was_masked = __sd_nvic_irq_disable(); - if (!nrf_nvic_state.__cr_flag) - { - nrf_nvic_state.__cr_flag = 1; - nrf_nvic_state.__irq_masks[0] = ( NVIC->ICER[0] & __NRF_NVIC_APP_IRQS_0 ); - NVIC->ICER[0] = __NRF_NVIC_APP_IRQS_0; -- #ifdef NRF52 - nrf_nvic_state.__irq_masks[1] = ( NVIC->ICER[1] & __NRF_NVIC_APP_IRQS_1 ); - NVIC->ICER[1] = __NRF_NVIC_APP_IRQS_1; -- #endif - *p_is_nested_critical_region = 0; - } - else - { - *p_is_nested_critical_region = 1; - } - if (!was_masked) - { - __sd_nvic_irq_enable(); - } - return NRF_SUCCESS; - } - - __STATIC_INLINE uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_critical_region) - { - if (nrf_nvic_state.__cr_flag && (is_nested_critical_region == 0)) - { - int was_masked = __sd_nvic_irq_disable(); - NVIC->ISER[0] = nrf_nvic_state.__irq_masks[0]; -- #ifdef NRF52 - NVIC->ISER[1] = nrf_nvic_state.__irq_masks[1]; -- #endif - nrf_nvic_state.__cr_flag = 0; - if (!was_masked) - { - __sd_nvic_irq_enable(); - } - } - - return NRF_SUCCESS; - } - --#ifdef NRF51 --#define SD_EVT_IRQn (SWI2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */ --#define SD_EVT_IRQHandler (SWI2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. */ --#define RADIO_NOTIFICATION_IRQn (SWI1_IRQn) /**< The radio notification IRQ number. */ --#define RADIO_NOTIFICATION_IRQHandler (SWI1_IRQHandler) /**< The radio notification IRQ handler. */ --#endif --#ifdef NRF52 - #define SD_EVT_IRQn (SWI2_EGU2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */ - #define SD_EVT_IRQHandler (SWI2_EGU2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. - The default interrupt priority for this handler is set to 4 */ - #define RADIO_NOTIFICATION_IRQn (SWI1_EGU1_IRQn) /**< The radio notification IRQ number. */ - #define RADIO_NOTIFICATION_IRQHandler (SWI1_EGU1_IRQHandler) /**< The radio notification IRQ handler. - The default interrupt priority for this handler is set to 4 */ --#endif -- - -/**@brief Set bits in the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[in] gpregret_msk Bits to be set in the GPREGRET register. - * -- * @note nRF51 does only have one general purpose retained register, so gpregret_id must be 0 on nRF51. - * @retval ::NRF_SUCCESS - */ - SVCALL(SD_POWER_GPREGRET_SET, uint32_t, sd_power_gpregret_set(uint32_t gpregret_id, uint32_t gpregret_msk)); - - /**@brief Clear bits in the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[in] gpregret_msk Bits to be clear in the GPREGRET register. - * -- * @note nRF51 does only have one general purpose retained register, so gpregret_id must be 0 on nRF51. - * @retval ::NRF_SUCCESS - */ - SVCALL(SD_POWER_GPREGRET_CLR, uint32_t, sd_power_gpregret_clr(uint32_t gpregret_id, uint32_t gpregret_msk)); - - /**@brief Get contents of the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[out] p_gpregret Contents of the GPREGRET register. - * -- * @note nRF51 does only have one general purpose retained register, so gpregret_id must be 0 on nRF51. - * @retval ::NRF_SUCCESS - */ - SVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t gpregret_id, uint32_t *p_gpregret)); - - /**@brief Flash Write - * - * Commands to write a buffer to flash - * - * If the SoftDevice is enabled: - * This call initiates the flash access command, and its completion will be communicated to the - * application with exactly one of the following events: - * - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. - * - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. - * - * If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the - * write has been completed - * - * @note - * - This call takes control over the radio and the CPU during flash erase and write to make sure that - * they will not interfere with the flash access. This means that all interrupts will be blocked --* for a predictable time (depending on the NVMC specification in nRF51 Series Reference Manual -+* for a predictable time (depending on the NVMC specification in the device's Product Specification - * and the command parameters). - * - The data in the p_src buffer should not be modified before the @ref NRF_EVT_FLASH_OPERATION_SUCCESS - * or the @ref NRF_EVT_FLASH_OPERATION_ERROR have been received if the SoftDevice is enabled. - * - * - * @param[in] p_dst Pointer to start of flash location to be written. - * @param[in] p_src Pointer to buffer with data to be written. --* @param[in] size Number of 32-bit words to write. Maximum size is 256 32-bit words for nRF51 and 1024 for nRF52. -+* @param[in] size Number of 32-bit words to write. Maximum size is the number of words in one -+* flash page. See the device's Product Specification for details. - * - * @retval ::NRF_ERROR_INVALID_ADDR Tried to write to a non existing flash address, or p_dst or p_src was unaligned. - * @retval ::NRF_ERROR_BUSY The previous command has not yet completed. - * @retval ::NRF_ERROR_INVALID_LENGTH Size was 0, or higher than the maximum allowed size. - * @retval ::NRF_ERROR_FORBIDDEN Tried to write to or read from protected location. - * @retval ::NRF_SUCCESS The command was accepted. - */ - SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * p_src, uint32_t size)); - - - /**@brief Flash Erase page - * - * Commands to erase a flash page - * If the SoftDevice is enabled: - * This call initiates the flash access command, and its completion will be communicated to the - * application with exactly one of the following events: - * - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. - * - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. - * - * If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the - * erase has been completed - * - * @note - * - This call takes control over the radio and the CPU during flash erase and write to make sure that - * they will not interfere with the flash access. This means that all interrupts will be blocked --* for a predictable time (depending on the NVMC specification in nRF51 Series Reference Manual -+* for a predictable time (depending on the NVMC specification in the device's Product Specification - * and the command parameters). - * - * - * @param[in] page_number Page number of the page to erase - * - * @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. - * @retval ::NRF_ERROR_INVALID_ADDR Tried to erase to a non existing flash page. - * @retval ::NRF_ERROR_BUSY The previous command has not yet completed. - * @retval ::NRF_ERROR_FORBIDDEN Tried to erase a protected page. - * @retval ::NRF_SUCCESS The command was accepted. - */ - SVCALL(SD_FLASH_PAGE_ERASE, uint32_t, sd_flash_page_erase(uint32_t page_number)); - - - /**@brief Flash Protection set - * - * Commands to set the flash protection configuration registers. -- On nRF51 this sets the PROTENSETx registers of the MPU peripheral. -- On nRF52 this sets the CONFIGx registers of the BPROT peripheral. -+ This sets the CONFIGx registers of the BPROT peripheral. - * - * @note To read the values read them directly. They are only write-protected. - * - * @param[in] block_cfg0 Value to be written to the configuration register. - * @param[in] block_cfg1 Value to be written to the configuration register. -- * @param[in] block_cfg2 Value to be written to the configuration register (ignored on nRF51). -- * @param[in] block_cfg3 Value to be written to the configuration register (ignored on nRF51). -+ * @param[in] block_cfg2 Value to be written to the configuration register. -+ * @param[in] block_cfg3 Value to be written to the configuration register. - * - * @retval ::NRF_ERROR_FORBIDDEN Tried to protect the SoftDevice. - * @retval ::NRF_SUCCESS Values successfully written to configuration registers. - */ - - -//| -//| Version information update -//| - /** @brief The major version for the SoftDevice binary distributed with this header file. */ --#define SD_MAJOR_VERSION (4) -+#define SD_MAJOR_VERSION (5) - - - /** @brief The bugfix version for the SoftDevice binary distributed with this header file. */ --#define SD_BUGFIX_VERSION (3) -+#define SD_BUGFIX_VERSION (0) - - -//| -//| SoftDevice unique string related updates -//| -+/** @brief SoftDevice unique string size in bytes. */ -+#define SD_UNIQUE_STR_SIZE 20 -+ - - -+/** @brief Defines the offset for the SoftDevice unique string relative to the SoftDevice base address. -+ * The SD_UNIQUE_STR is stored as an array of uint8_t. The size of array is @ref SD_UNIQUE_STR_SIZE. -+ */ -+#define SD_UNIQUE_STR_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x18) -+ - --/** @brief Defines a macro for retrieving the actual FWID value from a given base address. Use @ref -- * MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the usual -- * case). */ -+/** @brief Defines a macro for retrieving the actual SoftDevice version from a given base address. -+ * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR -+ * (the usual case). */ - #define SD_VERSION_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_VERSION_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ - ? (*((uint32_t *) ((baseaddr) + SD_VERSION_OFFSET))) : SDM_INFO_FIELD_INVALID) - -+/** @brief Defines a macro for retrieving the address of SoftDevice unique str based on a given base address. -+ * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR -+ * (the usual case). */ -+#define SD_UNIQUE_STR_ADDR_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_UNIQUE_STR_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ -+ ? (((uint8_t *) ((baseaddr) + SD_UNIQUE_STR_OFFSET))) : SDM_INFO_FIELD_INVALID) -+ - -//| -//| New defines for timing constraints the application must take into account when using NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND with the Radio Timeslot API. -//| -+/**@brief The maximum processing time to handle a timeslot extension. */ -+#define NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US (17) -+ -+/**@brief The latest time before the end of a timeslot the timeslot can be extended. */ -+#define NRF_RADIO_MIN_EXTENSION_MARGIN_US (79) -+ - - enum NRF_RADIO_SIGNAL_CALLBACK_ACTION - { - NRF_RADIO_SIGNAL_CALLBACK_ACTION_NONE, /**< Return without action. */ -- NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND, /**< Request an extension of the current timeslot (maximum execution time for this action is when the extension succeeded). */ -+ NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND, /**< Request an extension of the current -+ timeslot. Maximum execution time for this action: -+ @ref NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US. -+ This action must be started at least @ref -+ NRF_RADIO_MIN_EXTENSION_MARGIN_US before -+ the end of the timeslot. */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_END, /**< End the current radio timeslot. */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END /**< Request a new radio timeslot and end the current timeslot. */ - }; - \ No newline at end of file diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/doc/ble_api.dox b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/doc/ble_api.dox deleted file mode 100644 index e2913931ea..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/doc/ble_api.dox +++ /dev/null @@ -1,3685 +0,0 @@ -/** - * @addtogroup BLE_COMMON - * @{ - * @defgroup BLE_COMMON_MSC Message Sequence Charts - * @{ - * - * @defgroup BLE_COMMON_ENABLE BLE Stack Enable - * @{ - * @msc - * hscale = "1.5"; - * APP,SD; - * |||; - * APP=>SD [label = "sd_softdevice_enable(clock, assertion_handler);"]; - * APP<SD [label = "sd_ble_cfg_set(cfg_id, cfg, app_ram_base);"]; - * APP<SD [label = "sd_ble_cfg_set(cfg_id, cfg, app_ram_base);"]; - * APP<SD [label = "sd_ble_enable(&app_ram_base);"]; - * APP<SD [label = "sd_ble_enable(&app_ram_base);"]; - * APP<SD [label = "sd_ble_enable(&app_ram_base);"]; - * APP<SD [label = "sd_softdevice_enable(clock, assertion_handler);"]; - * APP<SD [label = "sd_ble_cfg_set(cfg_id, cfg, app_ram_base);"]; - * APP<SD [label = "sd_ble_cfg_set(cfg_id, cfg, app_ram_base);"]; - * APP<SD [label = "sd_ble_enable(&app_ram_base);"]; - * APP<SD [label = "sd_softdevice_enable(clock, assertion_handler);"]; - * APP<SD [label = "sd_ble_cfg_set(BLE_CONN_CFG_GAP, cfg = {conn_cfg_tag = 1, gap_conn_cfg.conn_count = 1, app_ram_base);"]; - * APP<SD [label = "sd_ble_cfg_set(BLE_CONN_CFG_GATT, cfg = {conn_cfg_tag = 1, gatt_conn_cfg, app_ram_base);"]; - * APP<SD [label = "sd_ble_cfg_set(BLE_CONN_CFG_GATTC, cfg = {conn_cfg_tag = 1, gattc_conn_cfg, app_ram_base);"]; - * APP<SD [label = "sd_ble_cfg_set(BLE_CONN_CFG_GATTS, cfg = {conn_cfg_tag = 1, gatts_conn_cfg, app_ram_base);"]; - * APP<SD [label = "sd_ble_enable(&app_ram_base);"]; - * APP<SD [label = "sd_ble_gap_connect(params, conn_cfg_tag = BLE_CONN_CFG_TAG_DEFAULT);"]; - * APP<SD [label = "sd_ble_gap_adv_start(params, conn_cfg_tag = 1);"]; - * APP<SD [label = "sd_ble_gap_connect(params, conn_cfg_tag = 1);"]; - * APP<SD [label = "sd_softdevice_enable(clock, assertion_handler);"]; - * APP<SD [label = "sd_nvic_EnableIRQ(SD_EVT_IRQn)"]; - * APP<APP [label = "SD_EVT_IRQHandler()"]; - * APP=>SD [label = "sd_ble_evt_get(buffer);"]; - * APP<SD [label = "sd_softdevice_enable(clock, assertion_handler);"]; - * APP<SD [label = "sd_app_evt_wait(void);"]; - * APP rbox APP [label="App Thread Mode blocked, CPU in low power mode"]; - * |||; - * ...; - * |||; - * SD rbox SD [label="Event Available for the App"]; - * APP<SD [label = "sd_ble_evt_get(buffer);"]; - * APP<SD [label = "sd_app_evt_wait(void);"]; - * APP rbox APP [label="App Thread Mode blocked, CPU in low power mode"]; - * |||; - * ...; - * |||; - * SD rbox SD [label="Event Available for the App"]; - * APP<SD [label = "sd_ble_evt_get(buffer);"]; - * APP<SD [label = "sd_app_evt_wait(void);"]; - * APP rbox APP [label="App Thread Mode blocked, CPU in low power mode"]; - * |||; - * ...; - * |||; - * @endmsc - * - * @} - * @} - */ - -/** - * @addtogroup BLE_GAP - * @{ - * @defgroup BLE_GAP_MSC Message Sequence Charts - * @{ - * @defgroup BLE_GAP_ADV_MSC Advertising - * @msc - * hscale = "1.5"; - * APP,SD,SCANNERS; - * |||; - * APP=>SD [label = "sd_ble_gap_addr_set(peer_addr)"]; - * APP<SD [label = "sd_ble_gap_adv_data_set(adv, sr)"]; - * APP<SD [label = "sd_ble_gap_adv_start(params)"]; - * APP<SCANNERS [label = "ADV packet", textcolor="#000080", linecolor="#000080"]; - * SD->SCANNERS [label = "ADV packet", textcolor="#000080", linecolor="#000080"]; - * SD->SCANNERS [label = "ADV packet", textcolor="#000080", linecolor="#000080"]; - * ...; - * SD->SCANNERS [label = "ADV packet", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #1 App Stops Advertisement "]; - * APP=>SD [label = "sd_ble_gap_adv_stop()"]; - * APP<CENTRAL [label = "Connection Establishment", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONNECTED"]; - * |||; - * --- [label = " Variant #1 Local Disconnection "]; - * APP=>SD [label = "sd_ble_gap_disconnect(reason)"]; - * APP<CENTRAL [label = "Connection Termination", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DISCONNECTED {reason}"]; - * |||; - * --- [label = " Variant #2 Remote Disconnection "]; - * SD<:CENTRAL [label = "Connection Termination", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DISCONNECTED {reason}"]; - * @endmsc - * - * @defgroup BLE_GAP_CPU_MSC Peripheral Connection Parameter Update - * @msc - * hscale = "1.5"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established with conn. params. CP#1"]; - * |||; - * APP=>SD [label = "sd_ble_gap_conn_param_update(CP#2)"]; - * APP<CENTRAL [label = "L2CAP CPU Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #1 Central Accepts "]; - * |||; - * SD<:CENTRAL [label = "L2CAP CPU Response: Accepted", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:CENTRAL [label = "Connection Update Start", textcolor="#000080", linecolor="#000080"]; - * SD:>CENTRAL [label = "Connection Update Complete", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {CP#2}"]; - * |||; - * --- [label = " Variant #2 Central Rejects "]; - * |||; - * SD<:CENTRAL [label = "L2CAP CPU Response: Rejected", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {CP#1}"]; - * --- [label = " Variant #3 Central Ignores "]; - * |||; - * ...; - * |||; - * SD box SD [label="Timeout"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {CP#1}"]; - * @endmsc - * - * @defgroup BLE_GAP_RSSI_FILT_MSC RSSI for connections with event filter - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * --- [label = " Variant #1: Trigger event when a new RSSI is available"]; - * |||; - * APP=>SD [label = "sd_ble_gap_rssi_start(conn_handle, 0, 0)"]; - * APP<SD [label = "sd_ble_gap_rssi_stop()"]; - * APP<SD [label = "sd_ble_gap_rssi_start(conn_handle, 0x05, 0x00)"]; - * APP<SD [label = "sd_ble_gap_rssi_stop()"]; - * APP<SD [label = "sd_ble_gap_rssi_start(conn_handle, 0x05, 0x03)"]; - * APP<SD [label = "sd_ble_gap_rssi_stop()"]; - * APP<SD [label = "sd_ble_gap_rssi_get(conn_handle, p_rssi)"]; - * APP<SD [label = "sd_ble_gap_rssi_start(conn_handle, BLE_GAP_RSSI_THRESHOLD_INVALID, 0x00)"]; - * APP<SD [label = "sd_ble_gap_rssi_get(conn_handle, p_rssi)"]; - * APP<SD [label = "sd_ble_gap_rssi_get(conn_handle, p_rssi)"]; - * APP<SD [label = "sd_ble_gap_rssi_stop()"]; - * APP<SD [label = "sd_ble_gap_authenticate(params)"]; - * APP<CENTRAL [label = "SMP Security Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #1 Central initiates Security Establishment "]; - * |||; - * APP rbox CENTRAL [label="Encryption or Pairing/Bonding initiated by Central"]; - * |||; - * --- [label = " Variant #2 Central ignores "]; - * |||; - * ...; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: Timeout, error_src: local}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_LEGACY_MSC Peripheral Legacy Pairing - * @{ - * - * @defgroup BLE_GAP_PERIPH_PAIRING_JW_MSC Pairing: Just Works - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: no_bond, no_mitm, no_io_caps}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: no_bond, no_mitm, no_io_caps, p_keyset: NULL)"]; - * APP<CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD abox CENTRAL [label="Legacy Pairing Phase 2", textbgcolor="#7f7fff"]; - * |||; - * APP rbox CENTRAL [label = "Encrypted with STK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_NO_MITM}"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_BONDING_JW_MSC Bonding: Just Works - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: bond, no_mitm, no_io_caps}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: bond, no_mitm, no_io_caps, p_keyset)"]; - * APP<CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD abox CENTRAL [label="Legacy Pairing Phase 2", textbgcolor="#7f7fff"]; - * |||; - * APP rbox CENTRAL [label = "Encrypted with STK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_NO_MITM}"]; - * |||; - * SD abox CENTRAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_BONDING_PK_PERIPH_MSC Bonding: Passkey Entry, Peripheral displays - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: bond, mitm, keyboard}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: bond, mitm, display, p_keyset)"]; - * APP<CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PASSKEY_DISPLAY {passkey, match_request=0}"]; - * APP rbox APP [label="Passkey displayed to the user"]; - * |||; - * SD abox CENTRAL [label="Legacy Pairing Phase 2", textbgcolor="#7f7fff"]; - * |||; - * APP rbox CENTRAL [label = "Encrypted with STK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_MITM}"]; - * |||; - * SD abox CENTRAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_BONDING_PK_CENTRAL_OOB_MSC Bonding: Passkey Entry, User Inputs on Peripheral or OOB - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: bond, mitm, display}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: bond, mitm, keyboard, p_keyset)"]; - * APP<CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_KEY_REQUEST {type}"]; - * APP rbox APP [label="User enters Passkey or data received Out Of Band"]; - * APP=>SD [label = "sd_ble_gap_auth_key_reply(passkey or OOB)"]; - * APP<SD [label = "sd_ble_opt_set(opt_id = BLE_GAP_OPT_PASSKEY, p_opt->p_passkey=passkey)"]; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: bond, mitm, keyboard}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: bond, mitm, display, p_keyset)"]; - * - * APP<CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PASSKEY_DISPLAY {passkey, match_request=0}"]; - * APP rbox APP [label="Passkey displayed to the user"]; - * |||; - * SD abox CENTRAL [label="Legacy Pairing Phase 2", textbgcolor="#7f7fff"]; - * |||; - * APP rbox CENTRAL [label = "Encrypted with STK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_MITM}"]; - * |||; - * SD abox CENTRAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_PAIRING_CONFIRM_FAIL_MSC Pairing failure: Confirm failed - * This occurs if the random value doesn't match, usually because the user entered a wrong pin - * or out of band data was missing. - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: mitm, display}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: mitm, keyboard, p_keyset: NULL)"]; - * APP<CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * SD<:CENTRAL [label = "SMP Pairing Confirm", textcolor="#000080", linecolor="#000080"]; - * SD:>CENTRAL [label = "SMP Pairing Confirm", textcolor="#000080", linecolor="#000080"]; - * SD<:CENTRAL [label = "SMP Pairing Random", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: Confirm value, error_src: local}"]; - * SD:>CENTRAL [label = "SMP Pairing failed", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @} - * - * @defgroup BLE_GAP_PERIPH_LESC_MSC Peripheral LESC Pairing - * @{ - * - * @defgroup BLE_GAP_PERIPH_LESC_PAIRING_JW_MSC Pairing: Just Works - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: lesc, no_bond, no_mitm, no_io_caps}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: lesc, no_bond, no_mitm, no_io_caps, p_pk_own)"]; - * APP<CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk}"]; - * SD:>CENTRAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * SD abox CENTRAL [label="LESC Authentication Stage 1", textbgcolor="#7f7fff"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing DHKey Check: Ea", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP abox APP [label="App completes DHKey calculation"]; - * APP=>SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<CENTRAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox CENTRAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_NO_MITM}"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_LESC_BONDING_NC_MSC Bonding: Numeric Comparison - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: lesc, bond, mitm, display(kbd/yesno)}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: lesc, bond, mitm, display(kbd/yesno), keyset with p_pk_own)"]; - * APP<CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk}"]; - * SD:>CENTRAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * SD abox CENTRAL [label="LESC Authentication Stage 1", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_PASSKEY_DISPLAY {passkey, match_request=1}"]; - * APP rbox APP [label="Passkey displayed to the user, user compares values"]; - * |||; - * --- [label = " Variant #1 User confirms on both sides "]; - * APP=>SD [label = "sd_ble_gap_auth_key_reply(BLE_GAP_AUTH_KEY_TYPE_PASSKEY, NULL)"]; - * APP<SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<CENTRAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox CENTRAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {LESC_ENC_MITM}"]; - * |||; - * SD abox CENTRAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * --- [label = " Variant #2 User does not confirm locally "]; - * APP=>SD [label = "sd_ble_gap_auth_key_reply(BLE_GAP_AUTH_KEY_TYPE_NONE, NULL)"]; - * APP<CENTRAL [label = "SMP Pairing failed", textcolor="#000080", linecolor="#000080"]; - * --- [label = " Variant #3 User does not confirm remotely "]; - * SD<:CENTRAL [label = "SMP Pairing failed", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: num comp failure, error_src: remote}"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_LESC_BONDING_PKE_PD_MSC Bonding: Passkey Entry, Peripheral Displays - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: lesc, bond, mitm, keyboard}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: lesc, bond, mitm, display, keyset with p_pk_own)"]; - * APP<CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_PASSKEY_DISPLAY {passkey, match_request=0}"]; - * APP rbox APP [label="Passkey displayed to the user"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk}"]; - * SD:>CENTRAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * --- [label = " Optional keypresses from peer "]; - * SD<:CENTRAL [label = "Keypress Notification", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_KEY_PRESSED {type}"]; - * APP abox APP [label="App displays keypress"]; - * SD<:CENTRAL [label = "Keypress Notification", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_KEY_PRESSED {type}"]; - * APP abox APP [label="App displays keypress"]; - * |||; - * --- [label = ""]; - * SD abox CENTRAL [label="LESC Authentication Stage 1", textbgcolor="#7f7fff"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing DHKey Check: Ea", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP abox APP [label="App completes DHKey calculation"]; - * APP=>SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<CENTRAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox CENTRAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {LESC_ENC_MITM}"]; - * |||; - * SD abox CENTRAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC Bonding: Passkey Entry, User Inputs on Peripheral - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: lesc, bond, mitm, display}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: lesc, bond, mitm, keyboard, keyset with p_pk_own)"]; - * APP<CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_KEY_REQUEST {passkey}"]; - * APP rbox APP [label="User enters Passkey"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk}"]; - * SD:>CENTRAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * --- [label = " Optional keypresses sent to peer "]; - * APP=>SD [label = "sd_ble_gap_keypress_notify(type)"]; - * APP<CENTRAL [label = "Keypress Notification", textcolor="#000080", linecolor="#000080"]; - * APP=>SD [label = "sd_ble_gap_keypress_notify(type)"]; - * APP<CENTRAL [label = "Keypress Notification", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = ""]; - * APP=>SD [label = "sd_ble_gap_auth_key_reply(passkey)"]; - * APP<SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<CENTRAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox CENTRAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {LESC_ENC_MITM}"]; - * |||; - * SD abox CENTRAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC Bonding: Out of Band - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP=>SD [label = "sd_ble_gap_addr_set(addr)"]; - * APP<SD [label = "sd_ble_gap_lesc_oob_data_get(p_pk_own, p_oobd_own)"]; - * APP<SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: lesc, bond, oob, keyset with p_pk_own)"]; - * APP<CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk, oobd_req=1}"]; - * SD:>CENTRAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * APP=>SD [label = "sd_ble_gap_lesc_oob_data_set(p_oobd_own, p_oobd_peer)"]; - * APP<SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<CENTRAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox CENTRAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {LESC_ENC_MITM}"]; - * |||; - * SD abox CENTRAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @} - * - * @defgroup BLE_GAP_PERIPH_PAIRING_KS_OUT_OF_RANGE_MSC Pairing failure: Keysize out of supported range - * This occurs if the min key size offered by the peer is above 16, or max key size below 7. - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: Invalid params, error_src: local}"]; - * SD:>CENTRAL [label = "SMP Pairing failed", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_PAIRING_KS_TOO_SMALL_MSC GAP Failed Pairing: Keysize too small - * This occurs if the max key size offered by the peer is below the min key size specified by - * the app. - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS)"]; - * APP<CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * SD<:CENTRAL [label = "SMP Pairing Confirm", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: Enc key size, error_src: local}"]; - * SD:>CENTRAL [label = "SMP Pairing failed", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_PAIRING_APP_ERROR_MSC Pairing failure: Pairing aborted by the application - * When the application detects that the pairing should not be performed, for example an - * insufficient IO combination, it can use sd_ble_gap_sec_params_reply() to send - * SMP Pairing failed to the peer. - * - * When the stack handles the response from the application it will also validate - * the passkey (SMP_STC_PASSKEY_ENTRY_FAILED). If any error is detected it will be - * reported when sd_ble_gap_sec_params_reply() is called. - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST"]; - * SD abox APP [label="Stack looks for errors", textbgcolor="#7f7fff"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply()"]; - * APP<CENTRAL [label = "SMP Pairing failed", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: , error_src: local}"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_PAIRING_REMOTE_PAIRING_FAIL_MSC Pairing failure: Pairing failed from central - * SMP Pairing Failed may be sent from the central at various times. The application should - * prepare for this and gracefully handle the event. - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS)"]; - * APP<CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * SD<:CENTRAL [label = "SMP Pairing Failed", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: , error_src: remote}"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_PAIRING_TIMEOUT_MSC Pairing failure: Timeout - * This occurs if the central device doesn't continue the pairing sequence within 30 seconds. - * @msc - * hscale = "2"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS)"]; - * APP<CENTRAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * --- [ label = "Wait 30 sec" ]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: Timeout, error_src: local}"]; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_ENC_MSC Peripheral Encryption Establishment using stored keys - * @msc - * hscale = "1.5"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established"]; - * |||; - * SD<:CENTRAL [label = "LL Encryption Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_INFO_REQUEST {addr, ediv, rand}"]; - * |||; - * --- [label = " Variant #1 App Replies with Keys "]; - * |||; - * APP rbox APP [label = "Load Peripheral Keys"]; - * APP=>SD [label = "sd_ble_gap_sec_info_reply(ediv, rand, LTK)"]; - * APP<CENTRAL [label = "LL Encryption Response", textcolor="#000080", linecolor="#000080"]; - * APP rbox CENTRAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE"]; - * |||; - * --- [label = " Variant #2 App Replies without Keys "]; - * |||; - * APP=>SD [label = "sd_ble_gap_sec_info_reply(NULL)"]; - * APP<CENTRAL [label = "LL Reject Ind: Pin or Key Missing", textcolor="#000080", linecolor="#000080"]; - * APP rbox CENTRAL [label = "Link is NOT encrypted"]; - * |||; - * --- [label = " Variant #3 App Replies with Incorrect Keys "]; - * |||; - * APP rbox APP [label = "Load Incorrect Peripheral Keys"]; - * APP=>SD [label = "sd_ble_gap_sec_info_reply(ediv, rand, LTK)"]; - * APP<CENTRAL [label = "LL Encryption Response", textcolor="#000080", linecolor="#000080"]; - * SD<:CENTRAL [label = "Connection Termination", textcolor="#000080", linecolor="#000080"]; - * APP rbox CENTRAL [label = "Link Terminated"]; - * APP<<=SD [label = "BLE_GAP_EVT_DISCONNECTED {MIC Failure}"]; - * @endmsc - * @} - * - * - * - * @defgroup BLE_GAP_SCAN_MSC Scanning - * @msc - * hscale = "1.5"; - * APP,SD,ADVERTISERS; - * |||; - * APP=>SD [label = "sd_ble_gap_scan_start(params)"]; - * APP<SD [label = "sd_ble_gap_scan_stop()"]; - * APP<SD [label = "sd_ble_gap_connect(params)"]; - * APP<PERIPHERAL [label = "Scanning", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #1 Connection Established "]; - * SD<:>PERIPHERAL [label = "Connection Establishment", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONNECTED"]; - * |||; - * --- [label = " Variant #2 Connection Establishment Cancelled "]; - * APP=>SD [label = "sd_ble_gap_connect_cancel()"]; - * APP<SD [label = "sd_ble_gap_conn_param_update(CP#2)"]; - * APP<PERIPHERAL [label = "Connection Update Start", textcolor="#000080", linecolor="#000080"]; - * SD<:PERIPHERAL [label = "Connection Update Complete", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {CP#2}"]; - * |||; - * --- [label = " Peripheral Solicited procedure"]; - * |||; - * SD<:PERIPHERAL [label = "L2CAP CPU Request {CP#3}", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST {CP#3}"]; - * |||; - * --- [label = " Variant #1 App Accepts "]; - * APP=>SD [label = "sd_ble_gap_conn_param_update(CP#3)"]; - * APP<PERIPHERAL [label = "L2CAP CPU Response: Accepted", textcolor="#000080", linecolor="#000080"]; - * SD:>PERIPHERAL [label = "Connection Update Start", textcolor="#000080", linecolor="#000080"]; - * SD<:PERIPHERAL [label = "Connection Update Complete", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {CP#3}"]; - * |||; - * --- [label = " Variant #2 App Rejects "]; - * |||; - * APP=>SD [label = "sd_ble_gap_conn_param_update(NULL)"]; - * APP<PERIPHERAL [label = "L2CAP CPU Response: Rejected", textcolor="#000080", linecolor="#000080"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_SEC_MSC Central Security Procedures - * @{ - * - * @defgroup BLE_GAP_CENTRAL_SEC_REQ_MSC Security Request Reception - * @msc - * hscale = "1.5"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Security Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_REQUEST {bond, mitm}"]; - * |||; - * --- [label = " Variant #1 Central initiates Security Establishment "]; - * |||; - * APP=>SD [label = "sd_ble_gap_encrypt(ediv, rand, LTK)"]; - * APP<SD [label = "sd_ble_gap_authenticate(params)"]; - * APP<SD [label = "sd_ble_gap_authenticate(NULL)"]; - * APP<PERIPHERAL [label = "SMP Pairing Failed: Pairing Not Supported", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: Pairing Not Supp, error_src: local}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_LEGACY_MSC Central Legacy Pairing - * @{ - * - * @defgroup BLE_GAP_CENTRAL_PAIRING_JW_MSC Pairing: Just Works - * @msc - * hscale = "2"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate(no_bond, no_mitm, no_io_caps)"]; - * APP<PERIPHERAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: no_bond, no_mitm, no_io_caps}"]; - * |||; - * --- [label = " Variant #1 Central Accepts Peripheral parameters "]; - * |||; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: NULL, p_keyset: NULL)"]; - * |||; - * SD abox PERIPHERAL [label="Legacy Pairing Phase 2", textbgcolor="#7f7fff"]; - * |||; - * APP rbox PERIPHERAL [label = "Encrypted with STK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_NO_MITM}"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * |||; - * --- [label = " Variant #2 Central Rejects Peripheral parameters "]; - * |||; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(BLE_GAP_SEC_STATUS_INVALID_PARAMS, own_params: NULL, p_keyset: NULL)"]; - * |||; - * SD:>PERIPHERAL [label = "SMP Pairing Failed", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {FAILURE}"]; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_BONDING_JW_MSC Bonding: Just Works - * @msc - * hscale = "2"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate(bond, no_mitm, no_io_caps)"]; - * APP<PERIPHERAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: bond, no_mitm, no_io_caps}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: NULL, p_keyset)"]; - * |||; - * SD abox PERIPHERAL [label="Legacy Pairing Phase 2", textbgcolor="#7f7fff"]; - * |||; - * APP rbox PERIPHERAL [label = "Encrypted with STK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_NO_MITM}"]; - * |||; - * SD abox PERIPHERAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_BONDING_PK_PERIPH_MSC Bonding: Passkey Entry, Central displays - * @msc - * hscale = "2"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate(bond, mitm, display)"]; - * APP<PERIPHERAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Response}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: bond, mitm, keyboard}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: NULL, p_keyset)"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_PASSKEY_DISPLAY {passkey, match_request=0}"]; - * APP rbox APP [label="Passkey displayed to the user"]; - * |||; - * SD abox PERIPHERAL [label="Legacy Pairing Phase 2", textbgcolor="#7f7fff"]; - * |||; - * APP rbox PERIPHERAL [label = "Encrypted with STK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_MITM}"]; - * |||; - * SD abox PERIPHERAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC Bonding: Passkey Entry, User Inputs on Central or OOB - * @msc - * hscale = "2"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate(bond, mitm, keyboard)"]; - * APP<PERIPHERAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: bond, mitm, display}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: NULL, p_keyset)"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_KEY_REQUEST {type}"]; - * APP rbox APP [label="User enters Passkey or data received Out Of Band"]; - * APP=>SD [label = "sd_ble_gap_auth_key_reply(passkey or OOB)"]; - * APP<SD [label = "sd_ble_gap_authenticate(lesc, no_bond, no_mitm, no_io_caps)"]; - * APP<PERIPHERAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: lesc, no_bond, no_mitm, no_io_caps}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: NULL, p_pk_own)"]; - * APP<PERIPHERAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk}"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * SD abox PERIPHERAL [label="LESC Authentication Stage 1", textbgcolor="#7f7fff"]; - * |||; - * APP abox APP [label="App completes DHKey calculation"]; - * APP=>SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<PERIPHERAL [label = "SMP Pairing DHKey Check: Ea", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox PERIPHERAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {ENC_NO_MITM}"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC Bonding: Numeric Comparison - * @msc - * hscale = "2"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate(lesc, bond, mitm, display(kbd/yesno))"]; - * APP<PERIPHERAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: lesc, bond, mitm, display(kbd/yesno)}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: NULL, keyset with p_pk_own)"]; - * APP<PERIPHERAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk}"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * SD abox PERIPHERAL [label="LESC Authentication Stage 1", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_PASSKEY_DISPLAY {passkey, match_request=1}"]; - * APP rbox APP [label="Passkey displayed to the user, user compares values"]; - * |||; - * --- [label = " Variant #1 User confirms on both sides "]; - * APP=>SD [label = "sd_ble_gap_auth_key_reply(BLE_GAP_AUTH_KEY_TYPE_PASSKEY, NULL)"]; - * APP<SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<PERIPHERAL [label = "SMP Pairing DHKey Check: Ea", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox PERIPHERAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {LESC_ENC_MITM}"]; - * |||; - * SD abox PERIPHERAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * --- [label = " Variant #2 User does not confirm locally "]; - * APP=>SD [label = "sd_ble_gap_auth_key_reply(BLE_GAP_AUTH_KEY_TYPE_NONE, NULL)"]; - * APP<PERIPHERAL [label = "SMP Pairing failed", textcolor="#000080", linecolor="#000080"]; - * --- [label = " Variant #3 User does not confirm remotely "]; - * SD<:PERIPHERAL [label = "SMP Pairing failed", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {auth_status: num comp failure, error_src: remote}"]; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC Bonding: Passkey Entry: Central Displays - * @msc - * hscale = "2"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate(lesc, bond, mitm, display)"]; - * APP<PERIPHERAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: lesc, bond, mitm, keyboard}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: NULL, keyset with p_pk_own)"]; - * APP<PERIPHERAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk}"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * --- [label = " Optional keypresses from peer "]; - * SD<:PERIPHERAL [label = "Keypress Notification", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_KEY_PRESSED {type}"]; - * APP abox APP [label="App displays keypress"]; - * SD<:PERIPHERAL [label = "Keypress Notification", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_KEY_PRESSED {type}"]; - * APP abox APP [label="App displays keypress"]; - * |||; - * --- [label = ""]; - * SD abox PERIPHERAL [label="LESC Authentication Stage 1", textbgcolor="#7f7fff"]; - * |||; - * APP abox APP [label="App completes DHKey calculation"]; - * APP=>SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<PERIPHERAL [label = "SMP Pairing DHKey Check: Ea", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox PERIPHERAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {LESC_ENC_MITM}"]; - * |||; - * SD abox PERIPHERAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC Bonding: Passkey Entry: User Inputs on Central - * @msc - * hscale = "2"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate(lesc, bond, mitm, keyboard)"]; - * APP<PERIPHERAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: lesc, bond, mitm, display}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: NULL, keyset with p_pk_own)"]; - * APP<PERIPHERAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk}"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * --- [label = " Optional keypresses sent to peer "]; - * APP=>SD [label = "sd_ble_gap_keypress_notify(type)"]; - * APP<PERIPHERAL [label = "Keypress Notification", textcolor="#000080", linecolor="#000080"]; - * APP=>SD [label = "sd_ble_gap_keypress_notify(type)"]; - * APP<PERIPHERAL [label = "Keypress Notification", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = ""]; - * APP=>SD [label = "sd_ble_gap_auth_key_reply(passkey)"]; - * APP<SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<PERIPHERAL [label = "SMP Pairing DHKey Check: Ea", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox PERIPHERAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {LESC_ENC_MITM}"]; - * |||; - * SD abox PERIPHERAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC Bonding: Out of Band - * @msc - * hscale = "2"; - * APP,SD,PERIPHERAL; - * |||; - * APP=>SD [label = "sd_ble_gap_addr_set(addr)"]; - * APP<SD [label = "sd_ble_gap_lesc_oob_data_get(p_pk_own, p_oobd_own)"]; - * APP<SD [label = "sd_ble_gap_authenticate(lesc, bond, oob)"]; - * APP<PERIPHERAL [label = "SMP Pairing Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_SEC_PARAMS_REQUEST {peer_params: lesc, bond, oob}"]; - * APP=>SD [label = "sd_ble_gap_sec_params_reply(SUCCESS, own_params: NULL, keyset with p_pk_own)"]; - * APP<PERIPHERAL [label = "SMP Pairing Public Key: PKa", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing Public Key: PKb", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_LESC_DHKEY_REQUEST {p_peer_pk, oobd_req=1}"]; - * |||; - * APP abox APP [label="App starts DHKey calculation"]; - * |||; - * APP=>SD [label = "sd_ble_gap_lesc_oob_data_set(p_oobd_own, p_oobd_peer)"]; - * APP<SD [label = "sd_ble_gap_lesc_dhkey_reply(p_dhkey)"]; - * APP<PERIPHERAL [label = "SMP Pairing DHKey Check: Ea", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERAL [label = "SMP Pairing DHKey Check: Eb", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox PERIPHERAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {LESC_ENC_MITM}"]; - * |||; - * SD abox PERIPHERAL [label="SMP Pairing Phase 3", textbgcolor="#7f7fff"]; - * |||; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {SUCCESS}"]; - * APP rbox APP [label = "Keys stored in keyset"]; - * @endmsc - * @} - * - * - * @defgroup BLE_GAP_INVALID_SMP_PDU_MSC Unexpected Security Packet Reception - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP rbox PEER [label="No pairing in progress"]; - * |||; - * PEER rbox PEER [label="Peer misbehaving"]; - * |||; - * SD<:PEER [label = "SMP Pairing Failed (or other unexpected SMP PDU)", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_AUTH_STATUS {PDU_INVALID}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_ENC_MSC Encryption Establishment using stored keys - * @msc - * hscale = "1.5"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gap_encrypt(ediv, rand, LTK)"]; - * APP<PERIPHERAL [label = "LL Encryption Request", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #1 Peripheral replies with keys "]; - * |||; - * PERIPHERAL rbox PERIPHERAL [label = "Peripheral Loads Keys"]; - * SD<:PERIPHERAL [label = "LL Encryption Response", textcolor="#000080", linecolor="#000080"]; - * APP rbox PERIPHERAL [label = "Encrypted with LTK"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE"]; - * |||; - * --- [label = " Variant #2 Peripheral keys missing "]; - * |||; - * PERIPHERAL rbox PERIPHERAL [label = "Peripheral Keys Missing"]; - * SD<:PERIPHERAL [label = "LL Reject Ind: Pin or Key Missing", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE"]; - * APP rbox PERIPHERAL [label = "Link is NOT encrypted"]; - * |||; - * --- [label = " Variant #3 Incorrect peripheral keys "]; - * |||; - * PERIPHERAL rbox PERIPHERAL [label = "Peripheral Loads Incorrect Keys"]; - * SD<:PERIPHERAL [label = "LL Encryption Response", textcolor="#000080", linecolor="#000080"]; - * SD:>PERIPHERAL [label = "Connection Termination", textcolor="#000080", linecolor="#000080"]; - * APP rbox PERIPHERAL [label = "Link Terminated"]; - * APP<<=SD [label = "BLE_GAP_EVT_DISCONNECTED {MIC Failure}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC Central Encryption and Authentication mutual exclusion - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP=>SD [label = "sd_ble_gap_encrypt(ediv, rand, LTK)"]; - * APP<PEER [label = "Encryption Start", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP note SD [label = " Encryption in progress, authentication disallowed"]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate()"]; - * APP<SD [label = "sd_ble_gap_conn_param_update()"]; - * APP<PEER [label = "Connection Update Start", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP=>SD [label = "sd_ble_gap_encrypt(ediv, rand, LTK)"]; - * APP<SD [label = "sd_ble_gap_authenticate()"]; - * APP<PEER [label = "Encryption Start", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "Encryption Complete", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE "]; - * |||; - * APP=>SD [label = "sd_ble_gap_authenticate()"]; - * APP<SD [label = "sd_ble_gap_encrypt(ediv, rand, LTK)"]; - * APP<SD [label = "sd_ble_gap_conn_param_update(conn_handle_3, CP#3)"]; - * APP<PERIPHERALS [label = "Connection Update Start on link #3", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP=>SD [label = "sd_ble_gap_conn_param_update(conn_handle_1, CP#1)"]; - * APP<SD [label = "sd_ble_gap_conn_param_update(conn_handle_2, CP#2)"]; - * APP<PERIPHERALS [label = "L2CAP CPU Response: Accepted", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP note PERIPHERALS [label = " Additional procedure on link #2 fails, since another one is pending"]; - * |||; - * APP=>SD [label = "sd_ble_gap_conn_param_update(conn_handle_2, CP#5)"]; - * APP<PERIPHERALS [label = "Connection Update Start on link #1", textcolor="#000080", linecolor="#000080"]; - * SD<:PERIPHERALS [label = "Connection Update Complete on link #1", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {conn_handle_1, CP#1}"]; - * |||; - * SD:>PERIPHERALS [label = "Connection Update Start on link #2", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP note PERIPHERALS [label = " Peripheral solicited procedure on link #4"]; - * |||; - * SD<:PERIPHERALS [label = "L2CAP CPU Request {CP#4}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST {conn_handle_4, CP#4}"]; - * |||; - * APP=>SD [label = "sd_ble_gap_conn_param_update(conn_handle_4, CP#4)"]; - * APP<PERIPHERALS [label = "L2CAP CPU Response: Accepted", textcolor="#000080", linecolor="#000080"]; - * |||; - * SD<:PERIPHERALS [label = "Connection Update Complete on link #2", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {conn_handle_2, CP#2}"]; - * |||; - * SD:>PERIPHERALS [label = "Connection Update Start on link #4", textcolor="#000080", linecolor="#000080"]; - * SD<:PERIPHERALS [label = "Connection Update Complete on link #4", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {conn_handle_4, CP#4}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_MULTILINK_CTRL_PROC_MSC Central Control Procedure Serialization on multiple links - * @msc - * hscale = "1.5"; - * APP,SD,PERIPHERALS; - * |||; - * APP rbox PERIPHERALS [label="Connection Established with 4 peers, all with conn. params. CP#0"]; - * |||; - * APP note PERIPHERALS [label = " Peripheral solicited procedure on link #2"]; - * |||; - * SD<:PERIPHERALS [label = "L2CAP CPU Request {CP#2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST {conn_handle_2, CP#3}"]; - * |||; - * APP note PERIPHERALS [label = " Encryption procedure on link #3"]; - * |||; - * APP=>SD [label = "sd_ble_gap_encrypt(conn_handle_3, LTK#3)"]; - * APP<PERIPHERALS [label = "Encryption Start on link #3", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP note PERIPHERALS [label = " Connection Update procedure on link #1"]; - * |||; - * APP=>SD [label = "sd_ble_gap_conn_param_update(conn_handle_1, CP#1)"]; - * APP<SD [label = "sd_ble_gap_conn_param_update(conn_handle_2, CP#2)"]; - * APP<PERIPHERALS [label = "L2CAP CPU Response: Accepted", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP note PERIPHERALS [label = " Encryption procedure on link #4"]; - * |||; - * APP=>SD [label = "sd_ble_gap_encrypt(conn_handle_4, LTK#4)"]; - * APP<PERIPHERALS [label = "Encryption Start on link #4", textcolor="#000080", linecolor="#000080"]; - * SD<:PERIPHERALS [label = "Encryption Complete on link #4", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_SEC_UPDATE {conn_handle_4}"]; - * |||; - * SD:>PERIPHERALS [label = "Connection Update Start on link #1", textcolor="#000080", linecolor="#000080"]; - * SD<:PERIPHERALS [label = "Connection Update Complete on link #1", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {conn_handle_1, CP#1}"]; - * |||; - * SD:>PERIPHERALS [label = "Connection Update Start on link #2", textcolor="#000080", linecolor="#000080"]; - * SD<:PERIPHERALS [label = "Connection Update Complete on link #2", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONN_PARAM_UPDATE {conn_handle_2, CP#2}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_WL_SHARE_MSC Whitelist Sharing - * @msc - * hscale = "1.5"; - * APP,SD; - * |||; - * APP=>SD [label = "sd_ble_gap_adv_data_set(adv, sr)"]; - * APP<SD [label = "sd_ble_gap_whitelist_set(WL#1)"]; - * APP<SD [label = "sd_ble_gap_adv_start(fp = CONNREQ)"]; - * APP<SD [label = "sd_ble_gap_whitelist_set(WL#2)"]; - * APP<SD [label = "sd_ble_gap_scan_start(use_whitelist = 1)"]; - * APP<SD [label = "sd_ble_gap_adv_stop()"]; - * APP<SD [label = "sd_ble_gap_scan_stop()"]; - * APP<SD [label = "sd_ble_gap_whitelist_set(WL#2)"]; - * APP<SD [label = "sd_ble_gap_scan_start(use_whitelist = 1)"]; - * APP<SD [label = "sd_ble_gap_connect(use_whitelist = 1)"]; - * APP<SD [label = "sd_ble_gap_addr_set(addr)"]; - * APP<SD [label = "sd_ble_gap_adv_data_set(adv, sr)"]; - * APP<SD [label = "sd_ble_gap_privacy_set(params: {mode: DEVICE_PRIVACY, private_addr_type: RESOLVABLE } "]; - * APP<SD [label = "sd_ble_gap_adv_start(params: {p_peer_addr = NULL})"]; - * APP<SCANNERS [label = "ADV packet, Addr = Resolvable1", textcolor="#000080", linecolor="#000080"]; - * SD->SCANNERS [label = "ADV packet, Addr = Resolvable1", textcolor="#000080", linecolor="#000080"]; - * SD->SCANNERS [label = "ADV packet, Addr = Resolvable1", textcolor="#000080", linecolor="#000080"]; - * ...; - * SD box SD [label="Private address timeout"]; - * SD->SCANNERS [label = "ADV packet, Addr = Resolvable2", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #2 Advertise with address resolvable by local IRK in device identity list "]; - * |||; - * APP=>SD [label = "sd_ble_gap_privacy_set(params: {mode: DEVICE_PRIVACY, private_addr_type: RESOLVABLE } "]; - * APP<SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk1}}, pp_local_irks: {local_irk1}) "]; - * APP<SD [label = "sd_ble_gap_adv_start(params: {p_peer_addr = peer_addr1})"]; - * APP<SCANNERS [label = "ADV packet, Addr = Resolvable1", textcolor="#000080", linecolor="#000080"]; - * SD->SCANNERS [label = "ADV packet, Addr = Resolvable1", textcolor="#000080", linecolor="#000080"]; - * SD->SCANNERS [label = "ADV packet, Addr = Resolvable1", textcolor="#000080", linecolor="#000080"]; - * ...; - * SD box SD [label="Private address timeout"]; - * SD->SCANNERS [label = "ADV packet, Addr = Resolvable2", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #3 Advertise with non-resolvable address "]; - * |||; - * APP=>SD [label = "sd_ble_gap_privacy_set(params: {mode: DEVICE_PRIVACY, private_addr_type: NON_RESOLVABLE } "]; - * APP<SD [label = "sd_ble_gap_adv_start(params: {p_peer_addr = NULL})"]; - * APP<SCANNERS [label = "ADV packet, Addr = Non-Resolvable1", textcolor="#000080", linecolor="#000080"]; - * SD->SCANNERS [label = "ADV packet, Addr = Non-Resolvable1", textcolor="#000080", linecolor="#000080"]; - * SD->SCANNERS [label = "ADV packet, Addr = Non-Resolvable1", textcolor="#000080", linecolor="#000080"]; - * ...; - * SD box SD [label="Private address timeout"]; - * SD->SCANNERS [label = "ADV packet, Addr = Non-Resolvable2", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GAP_PRIVACY_SCAN_MSC Private Scanning - * @msc - * hscale = "1.5"; - * APP,SD,ADVERTISERS; - * |||; - * APP=>SD [label = "sd_ble_gap_addr_set(addr)"]; - * APP<SD [label = "sd_ble_gap_privacy_set(params: {mode: DEVICE_PRIVACY, private_addr_type: RESOLVABLE } "]; - * APP<SD [label = "sd_ble_gap_scan_start(params)"]; - * APP<SD [label = "ADV packet", textcolor="#000080", linecolor="#000080"]; - * SD->ADVERTISERS [label = "SCAN REQ packet, Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * ADVERTISERS->SD [label = "SCAN RSP packet", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #2 Active Scan with address resolvable by local IRKs "]; - * |||; - * APP=>SD [label = "sd_ble_gap_privacy_set(params: {mode: DEVICE_PRIVACY, private_addr_type: RESOLVABLE } "]; - * APP<SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk1}, {peer_addr2, peer_irk2}}, pp_local_irks: {local_irk1, local_irk2}) "]; - * APP<SD [label = "sd_ble_gap_scan_start(params)"]; - * APP<SD [label = "ADV packet, Addr = peer_addr1", textcolor="#000080", linecolor="#000080"]; - * SD box ADVERTISERS [label = "peer_addr1 is in the device identity list, respond with an address generated from local_irk1"]; - * SD->ADVERTISERS [label = "SCAN REQ packet, Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * ADVERTISERS->SD [label = "SCAN RSP packet, Addr = peer_addr1", textcolor="#000080", linecolor="#000080"]; - * |||; - * ...; - * ADVERTISERS->SD [label = "ADV packet, Addr = Resolvable2", textcolor="#000080", linecolor="#000080"]; - * SD box ADVERTISERS [label = "Resolvable2 resolved to device identity peer_addr2 in the device identity list, respond with an address generated from local_irk2"]; - * SD->ADVERTISERS [label = "SCAN REQ packet, Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * ADVERTISERS->SD [label = "SCAN RSP packet, Addr = peer_addr1", textcolor="#000080", linecolor="#000080"]; - * |||; - * ...; - * ADVERTISERS->SD [label = "ADV packet, Addr = peer_addr3", textcolor="#000080", linecolor="#000080"]; - * SD box ADVERTISERS [label = "peer_addr3 is not in the device identity list, respond with an address generated from device_irk"]; - * SD->ADVERTISERS [label = "SCAN REQ packet, Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * ADVERTISERS->SD [label = "SCAN RSP packet, Addr = peer_addr1", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #3 Active Scan with non-resolvable address "]; - * |||; - * APP=>SD [label = "sd_ble_gap_privacy_set(params: {mode: DEVICE_PRIVACY, private_addr_type: NON_RESOLVABLE } "]; - * APP<SD [label = "sd_ble_gap_scan_start(params)"]; - * APP<SD [label = "ADV packet", textcolor="#000080", linecolor="#000080"]; - * SD->ADVERTISERS [label = "SCAN REQ packet, Addr = Non-Resolvable", textcolor="#000080", linecolor="#000080"]; - * ADVERTISERS->SD [label = "SCAN RSP packet", textcolor="#000080", linecolor="#000080"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_PRIVACY_SCAN_PRIVATE_SCAN_MSC Scan Private Devices - * @msc - * hscale = "1.5"; - * APP,SD,ADVERTISERS; - * |||; - * APP=>SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk1}}, pp_local_irks: NULL) "]; - * APP<SD [label = "sd_ble_gap_scan_start(params)"]; - * APP<SD [label = "ADV packet, Addr = Resolvable1", textcolor="#000080", linecolor="#000080"]; - * SD note ADVERTISERS [label="Resolvable1 resolved to device identity peer_addr1"]; - * APP<<=SD [label = "BLE_GAP_EVT_ADV_REPORT {peer_addr1, rssi, data}"]; - * |||; - * ADVERTISERS->SD [label = "ADV packet, Addr = peer_addr2", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_ADV_REPORT {peer_addr2, rssi, data}"]; - * |||; - * --- [label = " Variant #2 Scan and resolve private devices with whitelist "]; - * |||; - * APP=>SD [label = "sd_ble_gap_whitelist_set({peer_addr1, Resolvable2}) "]; - * APP<SD [label = "sd_ble_gap_scan_start(params)"]; - * APP<SD [label = "ADV packet, Addr = Resolvable1", textcolor="#000080", linecolor="#000080"]; - * SD note ADVERTISERS [label="Resolvable1 resolved to device identity peer_addr1 which is in the whitelist"]; - * APP<<=SD [label = "BLE_GAP_EVT_ADV_REPORT {peer_addr1, rssi, data}"]; - * |||; - * ADVERTISERS->SD [label = "ADV packet, Addr = Resolvable2", textcolor="#000080", linecolor="#000080"]; - * SD note ADVERTISERS [label="Resolvable2 did not resolve to a device identity but is in the whitelist"]; - * APP<<=SD [label = "BLE_GAP_EVT_ADV_REPORT {Resolvable2, rssi, data}"]; - * |||; - * ADVERTISERS->SD [label = "ADV packet, Addr = Resolvable3", textcolor="#000080", linecolor="#000080"]; - * SD note ADVERTISERS [label="Resolvable3 is not in the whitelist, no report generated"]; - * |||; - * --- [label = " Variant #3 Scan directed advertisers and resolve initiator address using device IRK"]; - * |||; - * APP=>SD [label = "sd_ble_gap_scan_start()"]; - * APP<SD [label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * ADVERTISERS box SD [label = "Advertiser Address resolved using peer_irk1, Initiator address resolved using device_irk"]; - * APP<<=SD [label = "BLE_GAP_EVT_ADV_REPORT {peer_addr: peer_addr1"]; - * |||; - * --- [label = " Variant #4 Scan directed advertisers and resolve initiator address using local IRK in device identity list"]; - * |||; - * APP=>SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk1}}, pp_local_irks: local_irk1) "]; - * APP<SD [label = "sd_ble_gap_scan_start()"]; - * APP<SD [label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * ADVERTISERS box SD [label = "Advertiser Address resolved using peer_irk1, Initiator address resolved using local_irk1"]; - * APP<<=SD [label = "BLE_GAP_EVT_ADV_REPORT {peer_addr: peer_addr1"]; - * |||; - * --- [label = " Variant #5 Scan directed advertisers with unresolved direct address "]; - * |||; - * APP=>SD [label = "sd_ble_gap_scan_start(params: {adv_dir_report = 1})"]; - * APP<SD [label = "ADV packet, Advertiser Addr = peer_addr2, Initiator Addr = Resolvable2", textcolor="#000080", linecolor="#000080"]; - * ADVERTISERS box SD [label = "Resolvable2 could not be resolved, report the unresolved direct address"]; - * APP<<=SD [label = "BLE_GAP_EVT_ADV_REPORT {peer_addr: peer_addr2, direct_addr: Resolvable2}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC Directed Advertising - * @msc - * hscale = "1.5"; - * APP,SD,INITIATOR; - * |||; - * APP=>SD [label = "sd_ble_gap_addr_set(addr)"]; - * APP<SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk1}}, pp_local_irks: NULL) "]; - * APP<SD [label = "sd_ble_gap_adv_start(params: {p_peer_addr = peer_addr1})"]; - * APP<INITIATOR[label = "ADV packet, Advertiser Addr = addr, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = addr, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = addr, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #2 Private directed advertising to private peer using device IRK"]; - * |||; - * APP=>SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk1}}, pp_local_irks: NULL) "]; - * APP<SD [label = "sd_ble_gap_privacy_set(params: {mode: DEVICE_PRIVACY, private_addr_type: RESOLVABLE } "]; - * APP<SD [label = "sd_ble_gap_adv_start(params: {p_peer_addr = peer_addr1})"]; - * APP<INITIATOR[label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #3 Private directed advertising to private peer using local IRK in device identity list"]; - * |||; - * APP=>SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk1}}, pp_local_irks: {{local_irk1}}) "]; - * APP<SD [label = "sd_ble_gap_privacy_set(params: {mode: DEVICE_PRIVACY, private_addr_type: RESOLVABLE } "]; - * APP<SD [label = "sd_ble_gap_adv_start(params: {p_peer_addr = peer_addr1})"]; - * APP<INITIATOR[label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = Resolvable", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #4 Private directed advertising to non-private peer using local IRK in device identity list"]; - * |||; - * APP=>SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk=0..0}}, pp_local_irks: {{local_irk1}}) "]; - * APP<SD [label = "sd_ble_gap_privacy_set(params: {mode: DEVICE_PRIVACY, private_addr_type: RESOLVABLE } "]; - * APP<SD [label = "sd_ble_gap_adv_start(params: {p_peer_addr = peer_addr1})"]; - * APP<INITIATOR[label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = peer_addr1", textcolor="#000080", linecolor="#000080"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = peer_addr1", textcolor="#000080", linecolor="#000080"]; - * SD->INITIATOR[label = "ADV packet, Advertiser Addr = Resolvable, Initiator Addr = peer_addr1", textcolor="#000080", linecolor="#000080"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_PERIPH_CONN_PRIV_MSC Peripheral Connection Establishment with Private Peer - * @msc - * hscale = "1.5"; - * APP,SD,CENTRAL; - * |||; - * APP=>SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk1}}, pp_local_irks: NULL) "]; - * APP<CENTRAL [label = "Connection Establishment", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONNECTED, peer_addr = {peer_addr1, addr_id_peer = 1}"]; - * |||; - * --- [label = " Variant #2 Peer used identity address during connection setup "]; - * |||; - * APP rbox CENTRAL [label="Start Connectable Advertising"]; - * |||; - * SD<:>CENTRAL [label = "Connection Establishment", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONNECTED, peer_addr = {peer_addr1, addr_id_peer = 0}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_CENTRAL_CONN_PRIV_MSC Central Connection Establishment with Private Peer - * @msc - * hscale = "1.5"; - * APP,SD,PERIPHERAL; - * |||; - * APP=>SD [label = "sd_ble_gap_device_identities_set(pp_id_keys: {{peer_addr1, peer_irk1}}, pp_local_irks: NULL) "]; - * APP<SD [label = "sd_ble_gap_connect(peer_addr = {peer_addr1, addr_id_peer = 1})"]; - * APP<PERIPHERAL [label = "Scanning", textcolor="#000080", linecolor="#000080"]; - * --- [label = " Variant #1 Peer used resolvable addresses during connection setup "]; - * |||; - * SD<:>PERIPHERAL [label = "Connection Establishment", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONNECTED, peer_addr = {peer_addr1, addr_id_peer = 1}"]; - * |||; - * --- [label = " Variant #2 Peer used identity address during connection setup "]; - * |||; - * SD<:>PERIPHERAL [label = "Connection Establishment", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_CONNECTED, peer_addr = {peer_addr1, addr_id_peer = 0}"]; - * |||; - * @endmsc - * - * @} - * - * @defgroup BLE_GAP_EVT_PHY_MSC PHY Update Procedure - * @{ - * - * @defgroup BLE_GAP_CENTRAL_PHY_UPDATE Central PHY Update - * @msc - * hscale = "1.5"; - * APP,SD,PERIPHERAL; - * |||; - * APP rbox PERIPHERAL [label="Connection Established. Current TX PHY and RX PHY are both 1Mbit"]; - * |||; - * --- [label = " Variant #1 Initiated by Peripheral - no change in PHY "]; - * SD<=PERIPHERAL [label = "LL_PHY_REQ {tx_phys=2Mbit, rx_phys=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE_REQUEST {peer_preferred_phys={tx_phys=2Mbit, rx_phys=2Mbit}}"]; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {tx_phys=1Mbit, rx_phys=1Mbit})"]; - * APP<PERIPHERAL [label = "LL_PHY_UPDATE_IND - No change", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE {status=Success, {tx_phy=1Mbit, rx_phy=1Mbit}}"]; - * |||; - * --- [label = " Variant #2 Initiated by Peripheral - change of PHY required"]; - * SD<=PERIPHERAL [label = "LL_PHY_REQ {tx_phys=2Mbit, rx_phys=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE_REQUEST {peer_preferred_phys={tx_phys=2Mbit, rx_phys=2Mbit}}"]; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {tx_phys=2Mbit, rx_phys=2Mbit})"]; - * APP<PERIPHERAL [label = "LL_PHY_UPDATE_IND {M_TO_S_PHY=2Mbit, S_TO_M_PHY=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE {status=Success, {tx_phy=2Mbit, rx_phy=2Mbit}}"]; - * |||; - * --- [label = " Variant #3 Initiated by APP, not supported by peer"]; - * |||; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {ALL_PHY, ALL_PHY}) "]; - * APP<PERIPHERAL [label="LL_PHY_REQ", textcolor="#000080", linecolor="#000080"]; - * SD<=PERIPHERAL [label="LL_UNKNOWN_RSP", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label="BLE_GAP_EVT_PHY_UPDATE {Status=Not Supported}"]; - * |||; - * --- [label = " Variant #4 Initiated by APP, change required"]; - * |||; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {ALL_PHY, ALL_PHY}) "]; - * APP<PERIPHERAL [label = "LL_PHY_REQ {ALL_PHY, ALL_PHY}", textcolor="#000080", linecolor="#000080"]; - * SD<=PERIPHERAL [label = "LL_PHY_RSP {ALL_PHY, ALL_PHY}", textcolor="#000080", linecolor="#000080"]; - * SD=>PERIPHERAL [label = "LL_PHY_UPDATE_IND {M_TO_S_PHY=2Mbit, S_TO_M_PHY=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE {status=Success, {tx_phy=2Mbit, rx_phy=2Mbit}}"]; - * |||; - * --- [label = " Variant #5 Initiated by Peripheral - APP has no preferences for TX direction"]; - * SD<=PERIPHERAL [label = "LL_PHY_REQ {tx_phys=2Mbit, rx_phys=1Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE_REQUEST {peer_preferred_phys={tx_phys=2Mbit, rx_phys=1Mbit}}"]; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {tx_phys=BLE_GAP_PHY_AUTO, rx_phys=2Mbit})"]; - * APP<PERIPHERAL [label = "LL_PHY_UPDATE_IND {M_TO_S_PHY=1Mbit, S_TO_M_PHY=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE {status=Success, {tx_phy=1Mbit, rx_phy=2Mbit}}"]; - * |||; - * --- [label = " Variant #6 Initiated by APP, peer responding with invalid parameters"]; - * |||; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {ALL_PHY, ALL_PHY}) "]; - * APP<PERIPHERAL [label="LL_PHY_REQ {ALL_PHY, ALL_PHY}", textcolor="#000080", linecolor="#000080"]; - * SD<=PERIPHERAL [label="LL_PHY_RSP {tx_phys=0x00, rx_phys=0x00}", textcolor="#000080", linecolor="#000080"]; - * SD=>PERIPHERAL [label="LL_UNKNOWN_RSP", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label="BLE_GAP_EVT_PHY_UPDATE {Status=Invalid LMP Parameters}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GAP_PERIPHERAL_PHY_UPDATE Peripheral PHY Update - * @msc - * hscale = "1.5"; - * APP,SD,CENTRAL; - * |||; - * APP rbox CENTRAL [label="Connection Established. Current TX PHY and RX PHY are both 1Mbit"]; - * |||; - * --- [label = " Variant #1 Initiated by Central - no change in PHY "]; - * SD<=CENTRAL [label = "LL_PHY_REQ {tx_phys=2Mbit, rx_phys=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE_REQUEST {peer_preferred_phys={tx_phys=2Mbit, rx_phys=2Mbit}}"]; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {tx_phys=1Mbit, rx_phys=1Mbit})"]; - * APP<CENTRAL [label = "LL_PHY_RSP {tx_phys=1Mbit, rx_phys=1Mbit}", textcolor="#000080", linecolor="#000080"]; - * SD<=CENTRAL [label = "LL_PHY_UPDATE_IND - No change", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE {status=Success, {tx_phy=1Mbit, rx_phy=1Mbit}}"]; - * |||; - * --- [label = " Variant #2 Initiated by Central - change of PHY required"]; - * SD<=CENTRAL [label = "LL_PHY_REQ {tx_phys=2Mbit, rx_phys=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE_REQUEST {peer_preferred_phys={tx_phys=2Mbit, rx_phys=2Mbit}}"]; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {tx_phys=2Mbit, rx_phys=2Mbit})"]; - * APP<CENTRAL [label = "LL_PHY_RSP {tx_phys=2Mbit, rx_phys=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * SD<=CENTRAL [label = "LL_PHY_UPDATE_IND {M_TO_S_PHY=2Mbit, S_TO_M_PHY=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE {status=Success, {tx_phy=2Mbit, rx_phy=2Mbit}}"]; - * |||; - * --- [label = " Variant #3 Initiated by APP, not supported by peer"]; - * |||; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {ALL_PHY, ALL_PHY}) "]; - * APP<CENTRAL [label="LL_PHY_REQ", textcolor="#000080", linecolor="#000080"]; - * SD<=CENTRAL [label="LL_UNKNOWN_RSP", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label="BLE_GAP_EVT_PHY_UPDATE {Status=Not Supported}"]; - * |||; - * --- [label = " Variant #4 Initiated by APP, change required"]; - * |||; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {ALL_PHY, ALL_PHY}) "]; - * APP<CENTRAL [label="LL_PHY_REQ {ALL_PHY, ALL_PHY}", textcolor="#000080", linecolor="#000080"]; - * SD<=CENTRAL [label="LL_PHY_UPDATE_IND {M_TO_S_PHY=2Mbit, S_TO_M_PHY=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label="BLE_GAP_EVT_PHY_UPDATE {status=Success, {tx_phy=2Mbit, rx_phy=2Mbit}}"]; - * |||; - * --- [label = " Variant #5 Initiated by Central - APP has no preferences for TX direction"]; - * SD<=CENTRAL [label = "LL_PHY_REQ {tx_phys=2Mbit, rx_phys=1Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE_REQUEST {peer_preferred_phys={tx_phys=2Mbit, rx_phys=1Mbit}}"]; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {tx_phys=BLE_GAP_PHY_AUTO, rx_phys=2Mbit})"]; - * APP<CENTRAL [label = "LL_PHY_RSP {tx_phys=ALL_PHY, rx_phys=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * SD<=CENTRAL [label = "LL_PHY_UPDATE_IND {M_TO_S_PHY=2Mbit, S_TO_M_PHY=1Mbit}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE {status=Success, {tx_phy=1Mbit, rx_phy=2Mbit}}"]; - * |||; - * --- [label = " Variant #6 Collision between self-initiated PHY Update and peer initiated Channel Map Update procedures"]; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {tx_phys=2Mbit, rx_phys=2Mbit})"]; - * APP<CENTRAL [label = "LL_PHY_REQ {tx_phys=2Mbit, rx_phys=2Mbit}", textcolor="#000080", linecolor="#000080"]; - * SD<=CENTRAL [label = "LL_REJECT_EXT_IND {ErrorCode=Different Transaction Collision}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_PHY_UPDATE {status=Different Transaction Collision, {tx_phy=1Mbit, rx_phy=1Mbit}}"]; - * |||; - * --- [label = " Variant #7 Initiated by APP, peer responding with invalid parameters"]; - * |||; - * APP=>SD [label = "sd_ble_gap_phy_update(conn_handle, {ALL_PHY, ALL_PHY}) "]; - * APP<CENTRAL [label="LL_PHY_REQ {ALL_PHY, ALL_PHY}", textcolor="#000080", linecolor="#000080"]; - * SD<=CENTRAL [label="LL_PHY_UPDATE_IND {M_TO_S_PHY=(1Mbit|2Mbit), S_TO_M_PHY=(1Mbit|2Mbit)", textcolor="#000080", linecolor="#000080"]; - * SD=>CENTRAL [label="LL_UNKNOWN_RSP", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label="BLE_GAP_EVT_PHY_UPDATE {Status=Invalid LMP Parameters}"]; - * |||; - * @endmsc - * - * @} - - * @defgroup BLE_GAP_DATA_LENGTH_UPDATE_PROCEDURE_MSC Data Length Update Procedure - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Self initiated, automatic parameters "]; - * |||; - * SD rbox SD [label = "max_tx_octets=27, max_rx_octets=27"]; - * |||; - * ...; - * |||; - * APP=>SD [label = "sd_ble_gap_data_length_update(conn_handle, NULL, NULL)"]; - * APP<PEER [label = "LL Length Request {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "LL Length Response {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DATA_LENGTH_UPDATE {.effective_params={.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=2120, .max_rx_time_us=2120}}"]; - * |||; - * ...; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Self initiated, application set parameters "]; - * |||; - * SD rbox SD [label = "max_tx_octets=27, max_rx_octets=27"]; - * |||; - * ...; - * |||; - * APP=>SD [label = "sd_ble_gap_data_length_update(conn_handle, {.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=BLE_GAP_DATA_LENGTH_AUTO, .max_rx_time_us=BLE_GAP_DATA_LENGTH_AUTO}, NULL)"]; - * APP<PEER [label = "LL Length Request {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "LL Length Response {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DATA_LENGTH_UPDATE {.effective_params={.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=2120, .max_rx_time_us=2120}}"]; - * |||; - * ...; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Peer initiated, automatic parameters "]; - * SD rbox SD [label = "max_tx_octets=27, max_rx_octets=27"]; - * |||; - * ...; - * |||; - * SD<:PEER [label = "LL Length Request {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST {.peer_params={.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=2120, .max_rx_time_us=2120}}"]; - * APP=>SD [label = "sd_ble_gap_data_length_update(conn_handle, NULL, NULL)"]; - * APP<PEER [label = "LL Length Response {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DATA_LENGTH_UPDATE {.effective_params={.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=2120, .max_rx_time_us=2120}}"]; - * |||; - * ...; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Peer initiated, application set parameters"]; - * SD rbox SD [label = "max_tx_octets=27, max_rx_octets=27"]; - * |||; - * ...; - * |||; - * SD<:PEER [label = "LL Length Request {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST {.peer_params={.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=2120, .max_rx_time_us=2120}}"]; - * APP=>SD [label = "sd_ble_gap_data_length_update(conn_handle, {.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=BLE_GAP_DATA_LENGTH_AUTO, .max_rx_time_us=BLE_GAP_DATA_LENGTH_AUTO}, NULL)"]; - * APP<PEER [label = "LL Length Response {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DATA_LENGTH_UPDATE {.effective_params={.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=2120, .max_rx_time_us=2120}}"]; - * |||; - * ...; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Using the limitation out parameter to adjust Link Layer Data Channel PDU size, memory limited "]; - * |||; - * SD rbox SD [label = "max_tx_octets=27, max_rx_octets=27"]; - * |||; - * ...; - * |||; - * APP=>SD [label = "sd_ble_gap_data_length_update(conn_handle, {.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=BLE_GAP_DATA_LENGTH_AUTO, .max_rx_time_us=BLE_GAP_DATA_LENGTH_AUTO}, &limitation)"]; - * APP<SD [label = "sd_ble_gap_data_length_update(conn_handle, {.max_tx_octets=200, .max_rx_octets=200, .max_tx_time_us=BLE_GAP_DATA_LENGTH_AUTO, .max_rx_time_us=BLE_GAP_DATA_LENGTH_AUTO}, &limitation)"]; - * APP<PEER [label = "LL Length Request {tx=200, rx=200}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "LL Length Response {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DATA_LENGTH_UPDATE {.effective_params={.max_tx_octets=200, .max_rx_octets=200, .max_tx_time_us=1712, .max_rx_time_us=1712}}"]; - * |||; - * ...; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Using the limitation out parameter to adjust Link Layer Data Channel PDU size, time limited "]; - * |||; - * SD rbox SD [label = "max_tx_octets=27, max_rx_octets=27"]; - * |||; - * ...; - * |||; - * APP=>SD [label = "sd_ble_gap_data_length_update(conn_handle, {.max_tx_octets=251, .max_rx_octets=251, .max_tx_time_us=BLE_GAP_DATA_LENGTH_AUTO, .max_rx_time_us=BLE_GAP_DATA_LENGTH_AUTO}, &limitation)"]; - * APP<SD [label = "sd_ble_gap_data_length_update(conn_handle, {.max_tx_octets=251-178=73, .max_rx_octets=251-178=73, .max_tx_time_us=BLE_GAP_DATA_LENGTH_AUTO, .max_rx_time_us=BLE_GAP_DATA_LENGTH_AUTO}, &limitation)"]; - * APP<PEER [label = "LL Length Request {tx=73, rx=73}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "LL Length Response {tx=251, rx=251}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GAP_EVT_DATA_LENGTH_UPDATE {.effective_params={.max_tx_octets=73, .max_rx_octets=73, .max_tx_time_us=696, .max_rx_time_us=696}}"]; - * @endmsc - * @} - * - * @} - * @} - */ - -/** - * @addtogroup BLE_GATTC - * @{ - * @defgroup BLE_GATTC_MSC Message Sequence Charts - * @{ - * @defgroup BLE_GATTC_PRIM_SRVC_DISC_MSC GATTC Primary Service Discovery - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Variant #1 Discover All Services "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_primary_services_discover(handle, NULL)"]; - * APP<PEER [label = "ATT Read By Group Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read By Group Type Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP {SUCCESS, services}"]; - * APP=>SD [label = "sd_ble_gattc_primary_services_discover(handle + N, NULL)"]; - * APP<PEER [label = "ATT Read By Group Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read By Group Type Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP {SUCCESS, services}"]; - * APP=>SD [label = "sd_ble_gattc_primary_services_discover(handle + N + M, NULL)"]; - * APP<PEER [label = "ATT Read By Group Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Error Response: Attribute Not Found", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP {ATTRIBUTE_NOT_FOUND}"]; - * |||; - * --- [label = " Variant #2 Discover a Specific Service "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_primary_services_discover(handle, uuid)"]; - * APP<PEER [label = "ATT Find By Type Value Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Find By Type Value Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP {SUCCESS, services}"]; - * APP=>SD [label = "sd_ble_gattc_primary_services_discover(handle + N, uuid)"]; - * APP<PEER [label = "ATT Find By Type Value Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Find By Type Value Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP {SUCCESS, services}"]; - * APP=>SD [label = "sd_ble_gattc_primary_services_discover(handle + N + M, uuid)"]; - * APP<PEER [label = "ATT Find By Type Value Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Error Response: Attribute Not Found", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP {ATTRIBUTE_NOT_FOUND}"]; - * @endmsc - * - * @defgroup BLE_GATTC_REL_DISC_MSC GATTC Relationship Discovery - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_relationships_discover(handle_range)"]; - * APP<PEER [label = "ATT Read By Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read By Type Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_REL_DISC_RSP {SUCCESS, includes}"]; - * APP=>SD [label = "sd_ble_gattc_relationships_discover(handle_range + N)"]; - * APP<PEER [label = "ATT Read By Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read By Type Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_REL_DISC_RSP {SUCCESS, includes}"]; - * APP=>SD [label = "sd_ble_gattc_relationships_discover(handle_range + N + M)"]; - * APP<PEER [label = "ATT Read By Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Error Response: Attribute Not Found", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_REL_DISC_RSP {ATTRIBUTE_NOT_FOUND}"]; - * @endmsc - * - * @defgroup BLE_GATTC_CHAR_DISC_MSC GATTC Characteristic Discovery - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_characteristics_discover(handle_range)"]; - * APP<PEER [label = "ATT Read By Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read By Type Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_CHAR_DISC_RSP {SUCCESS, chars}"]; - * APP=>SD [label = "sd_ble_gattc_characteristics_discover(handle_range + N)"]; - * APP<PEER [label = "ATT Read By Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read By Type Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_CHAR_DISC_RSP {SUCCESS, chars}"]; - * APP=>SD [label = "sd_ble_gattc_characteristics_discover(handle_range + N + M)"]; - * APP<PEER [label = "ATT Read By Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Error Response: Attribute Not Found", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_CHAR_DISC_RSP {ATTRIBUTE_NOT_FOUND}"]; - * @endmsc - * - * @defgroup BLE_GATTC_DESC_DISC_MSC GATTC Descriptor Discovery - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_descriptors_discover(handle_range)"]; - * APP<PEER [label = "ATT Find Information Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Find Information Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_DESC_DISC_RSP {SUCCESS, descs}"]; - * APP=>SD [label = "sd_ble_gattc_descriptors_discover(handle_range + N)"]; - * APP<PEER [label = "ATT Find Information Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Find Information Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_DESC_DISC_RSP {SUCCESS, descs}"]; - * APP=>SD [label = "sd_ble_gattc_descriptors_discover(handle_range + N + M)"]; - * APP<PEER [label = "ATT Find Information Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Error Response: Attribute Not Found", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_DESC_DISC_RSP {ATTRIBUTE_NOT_FOUND}"]; - * @endmsc - * - * @defgroup BLE_GATTC_READ_UUID_MSC GATTC Read Characteristic Value by UUID - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_char_value_by_uuid_read(uuid, handle_range)"]; - * APP<PEER [label = "ATT Read By Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read By Type Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP {SUCCESS, char_values}"]; - * APP=>SD [label = "sd_ble_gattc_char_value_by_uuid_read(uuid, handle_range + N)"]; - * APP<PEER [label = "ATT Read By Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read By Type Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP {SUCCESS, char_values}"]; - * APP=>SD [label = "sd_ble_gattc_char_value_by_uuid_read(uuid, handle_range + N + M)"]; - * APP<PEER [label = "ATT Read By Type Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Error Response: Attribute Not Found", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP {ATTRIBUTE_NOT_FOUND}"]; - * @endmsc - * - * @defgroup BLE_GATTC_VALUE_READ_MSC GATTC Characteristic or Descriptor Value Read - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Variant #1 offset == 0 "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_read(handle, 0)"]; - * APP<PEER [label = "ATT Read Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_READ_RSP {SUCCESS, value}"]; - * |||; - * --- [label = " Variant #2 offset != 0 "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_read(handle, offset)"]; - * APP<PEER [label = "ATT Read Blob Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read Blob Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_READ_RSP {SUCCESS, value}"]; - * APP=>SD [label = "sd_ble_gattc_read(handle, offset + N)"]; - * APP<PEER [label = "ATT Read Blob Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read Blob Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_READ_RSP {SUCCESS, value}"]; - * APP=>SD [label = "sd_ble_gattc_read(handle, offset + N + M + 1)"]; - * APP<PEER [label = "ATT Read Blob Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Error Response: Invalid Offset", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_READ_RSP {INVALID_OFFSET}"]; - * @endmsc - * - * @defgroup BLE_GATTC_READ_MULT_MSC GATTC Read Multiple Characteristic Values - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Variant #1 Successful request "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_char_values_read(handles)"]; - * APP<PEER [label = "ATT Read Multiple Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Read Multiple Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_CHAR_VALS_READ_RSP {SUCCESS, char_values}"]; - * |||; - * --- [label = " Variant #2 Failing request (invalid handle) "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_char_values_read(handles)"]; - * APP<PEER [label = "ATT Read Multiple Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Error Response: Invalid Handle", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_CHAR_VALS_READ_RSP {INVALID_HANDLE, error_handle=}"]; - * @endmsc - * - * @defgroup BLE_GATTC_VALUE_WRITE_WITHOUT_RESP_MSC GATTC Characteristic Value Write Without Response - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * --- [label = " Variant #1 App does not keep track of the available queue element count for writes without responses "]; - * APP note PEER [label = " This variant makes it possible for APP to transmit writes without responses without keeping track of the available queue element count. However, successful queuing of writes without responses cannot be guaranteed. "]; - * |||; - * APP=>SD [label = "sd_ble_enable()"]; - * APP<SD [label = "sd_ble_gattc_write(BLE_GATT_OP_WRITE_CMD, handle, value_1)"]; - * APP<SD [label = "sd_ble_gattc_write(BLE_GATT_OP_WRITE_CMD, handle, value_2)"]; - * APP<SD [label = "sd_ble_gattc_write(BLE_GATT_OP_WRITE_CMD, handle, value_3)"]; - * APP<SD [label = "sd_ble_gattc_write(BLE_GATT_OP_WRITE_CMD, handle, value_4)"]; - * APP<PEER [label = "ATT Write Command {value_1}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Write Command {value_2}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Write Command {value_4}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE {SUCCESS, 3}"]; - * |||; - * --- [label = " Variant #2 App keeps track of the available queue element count for writes without responses "]; - * APP note PEER [label = " This variant makes it possible for APP to know when successful queuing of writes without responses is guaranteed. "]; - * |||; - * APP=>SD [label = "sd_ble_cfg_set(BLE_CONN_CFG_GATTC, gattc_conn_cfg.write_cmd_tx_queue_size = 2)"]; - * APP<SD [label = "sd_ble_enable()"]; - * APP<SD [label = "sd_ble_gattc_write(BLE_GATT_OP_WRITE_CMD, handle, value_1)"]; - * APP<SD [label = "sd_ble_gattc_write(BLE_GATT_OP_WRITE_CMD, handle, value_2)"]; - * APP<PEER [label = "ATT Write Command {value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE {SUCCESS, 1}"]; - * APP abox APP [label="available_queue_element_count += 1"]; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_WRITE_CMD, handle, value_3)"]; - * APP<PEER [label = "ATT Write Command {value_2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE {SUCCESS, 1}"]; - * APP abox APP [label="available_queue_element_count += 1"]; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_WRITE_CMD, handle, value_4)"]; - * APP<PEER [label = "ATT Write Command {value_3}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Write Command {value_4}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE {SUCCESS, 2}"]; - * APP abox APP [label="available_queue_element_count += 2"]; - * @endmsc - * - * @defgroup BLE_GATTC_VALUE_WRITE_MSC GATTC Characteristic or Descriptor Value Write - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_WRITE_REQ, handle, value)"]; - * APP<PEER [label = "ATT Write Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_RSP {BLE_GATT_OP_WRITE_REQ, SUCCESS}"]; - * @endmsc - * - * @defgroup BLE_GATTC_VALUE_LONG_WRITE_MSC GATTC Characteristic or Descriptor Value Long Write - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_PREP_WRITE_REQ, handle, offset_1, value_1)"]; - * APP<PEER [label = "ATT Prepare Write Request {handle, offset_1, value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Response {handle, offset_1, value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_RSP {BLE_GATT_OP_PREP_WRITE_REQ, SUCCESS, value_1}"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_PREP_WRITE_REQ, handle, offset_2, value_2)"]; - * APP<PEER [label = "ATT Prepare Write Request {handle, offset_2, value_2}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Response {handle, offset_2, value_2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_RSP {BLE_GATT_OP_PREP_WRITE_REQ, SUCCESS, value_2}"]; - * |||; - * ...; - * |||; - * --- [label = " Variant #1 App executes the Long Write procedure "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_EXEC_WRITE_REQ, PREPARED_WRITE)"]; - * APP<PEER [label = "ATT Execute Write Request: flags = 0x01", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_RSP {BLE_GATT_OP_EXEC_WRITE_REQ, SUCCESS}"]; - * |||; - * --- [label = " Variant #2 App cancels the Long Write procedure "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_EXEC_WRITE_REQ, PREPARED_CANCEL)"]; - * APP<PEER [label = "ATT Execute Write Request: flags = 0x00", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_RSP {BLE_GATT_OP_EXEC_WRITE_REQ, SUCCESS}"]; - * @endmsc - * - * @defgroup BLE_GATTC_VALUE_RELIABLE_WRITE_MSC GATTC Characteristic or Descriptor Value Reliable Write - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_PREP_WRITE_REQ, handle_1, offset, value_1)"]; - * APP<PEER [label = "ATT Prepare Write Request {handle_1, offset, value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Response {handle_1, offset, value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_RSP {BLE_GATT_OP_PREP_WRITE_REQ, SUCCESS, value_1}"]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_PREP_WRITE_REQ, handle_2, offset, value_2)"]; - * APP<PEER [label = "ATT Prepare Write Request {handle_2, offset, value_2}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Response {handle_2, offset, value_2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_RSP {BLE_GATT_OP_PREP_WRITE_REQ, SUCCESS, value_2}"]; - * |||; - * ...; - * |||; - * --- [label = " Variant #1 App executes the Reliable Write procedure "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_EXEC_WRITE_REQ, PREPARED_WRITE)"]; - * APP<PEER [label = "ATT Execute Write Request: flags = 0x01", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_RSP {BLE_GATT_OP_EXEC_WRITE_REQ, SUCCESS}"]; - * |||; - * --- [label = " Variant #2 App cancels the Reliable Write procedure "]; - * |||; - * APP=>SD [label = "sd_ble_gattc_write(BLE_GATT_OP_EXEC_WRITE_REQ, PREPARED_CANCEL)"]; - * APP<PEER [label = "ATT Execute Write Request: flags = 0x00", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_WRITE_RSP {BLE_GATT_OP_EXEC_WRITE_REQ, SUCCESS}"]; - * @endmsc - * - * @defgroup BLE_GATTC_HVI_MSC GATTC Handle Value Indication - * GATTC Handle Value Indication MSC - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD<:PEER [label = "ATT Handle Value Indication", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_HVX {INDICATION, data}"]; - * APP=>SD [label = "sd_ble_gattc_hv_confirm(handle)"]; - * APP<PEER [label = "ATT Handle Value Confirmation", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GATTC_HVN_MSC GATTC Handle Value Notification - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD<:PEER [label = "ATT Handle Value Notification", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTC_EVT_HVX {NOTIFICATION, data}"]; - * @endmsc - * - * @defgroup BLE_GATTC_TIMEOUT_MSC GATTC Timeout - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP rbox PEER [label="Any GATTC API used"]; - * SD:>PEER [label = "ATT Packet", textcolor="#000080", linecolor="#000080"]; - * APP note PEER [label = "No Response from Peer"]; - * |||; - * ...; - * |||; - * SD box SD [label="Timeout"]; - * APP<<=SD [label = "BLE_GATTC_EVT_TIMEOUT {source}"]; - * APP rbox PEER [label="No additional ATT Traffic Allowed", textbgcolour="#ff7f7f"]; - * APP=>SD [label = "Any API call"]; - * APP<SD [label = "sd_ble_cfg_set(BLE_CONN_CFG_GATT, gatt_conn_cfg.att_mtu=100)"]; - * APP<SD [label = "sd_ble_enable()"]; - * APP<SD [label = "sd_ble_gattc_exchange_mtu_request(conn_handle, client_rx_mtu=80)"]; - * APP<PEER [label = "ATT Exchange MTU Request {client_rx_mtu=80}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Exchange MTU Response {server_rx_mtu=75}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="att_mtu=75"]; - * APP<<=SD [label = "BLE_GATTC_EVT_EXCHANGE_MTU_RSP {SUCCESS, server_rx_mtu=75}"]; - * @endmsc - * - * @} - * @} - */ - -/** - * @addtogroup BLE_GATTS - * @{ - * @defgroup BLE_GATTS_MSC Message Sequence Charts - * @{ - * @defgroup BLE_GATTS_ATT_TABLE_POP_MSC GATTS ATT Table Population - * @msc - * hscale = "1.5"; - * APP,SD; - * |||; - * APP=>SD [label = "sd_ble_gatts_service_add(uuid#1)"]; - * APP<SD [label = "sd_ble_gatts_characteristic_add(handle_srvc#1, char_md, value)"]; - * APP<SD [label = "sd_ble_gatts_descriptor_add(handle_char#1, value)"]; - * APP<SD [label = "sd_ble_gatts_descriptor_add(handle_char#1, value)"]; - * APP<SD [label = "sd_ble_gatts_characteristic_add(handle_srvc#1, char_md, value)"]; - * APP<SD [label = "sd_ble_gatts_descriptor_add(handle_char#2, value)"]; - * APP<SD [label = "sd_ble_gatts_service_add(uuid#2)"]; - * APP<SD [label = "sd_ble_gatts_include_add(handle_srvc#2, handle_srvc#1)"]; - * APP<PEER [label = "ATT Read Response", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GATTS_WRITE_REQ_NO_AUTH_MSC GATTS Write Request without Authorization - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * SD<:PEER [label = "ATT Write Request {peer_value}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Write Response", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="Value in ATT Table: peer_value"]; - * APP<<=SD [label = "BLE_GATTS_EVT_WRITE {WRITE_REQ, auth_required=0, peer_value}"]; - * @endmsc - * - * @defgroup BLE_GATTS_WRITE_CMD_NO_AUTH_MSC GATTS Write Command Without Authorization - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * SD<:PEER [label = "ATT Write Command {peer_value}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="Value in ATT Table: peer_value"]; - * APP<<=SD [label = "BLE_GATTS_EVT_WRITE {WRITE_CMD, auth_required=0, peer_value}"]; - * @endmsc - * - * @defgroup BLE_GATTS_WRITE_CMD_AUTH_MSC GATTS Write Command With Authorization - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * SD<:PEER [label = "ATT Write Command {peer_value}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * APP<<=SD [label = "BLE_GATTS_EVT_WRITE {WRITE_CMD, auth_required=1, peer_value}"]; - * --- [label = " Variant #1 App Authorizes "]; - * APP=>SD [label = "sd_ble_gatts_value_set(peer_value)"]; - * APP<SD [label = "sd_ble_gatts_value_set(app_value)"]; - * APP<SD [label = "sd_ble_gatts_rw_authorize_reply(SUCCESS, app_value)"]; - * APP<PEER [label = "ATT Read Response {app_value}", textcolor="#000080", linecolor="#000080"]; - * --- [label = " Variant #2 App Disallows "]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(READ_NOT_PERMITTED)"]; - * APP<PEER [label = "ATT Error Response", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GATTS_WRITE_REQ_AUTH_MSC GATTS Write Request with Authorization - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * SD<:PEER [label = "ATT Write Request {peer_value}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, peer_value}"]; - * --- [label = " Variant #1 App Authorizes "]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(SUCCESS, peer_value)"]; - * APP<PEER [label = "ATT Write Response", textcolor="#000080", linecolor="#000080"]; - * --- [label = " Variant #2 App Authorizes but changes value "]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(SUCCESS, app_value)"]; - * APP<PEER [label = "ATT Write Response", textcolor="#000080", linecolor="#000080"]; - * --- [label = " Variant #3 App Disallows "]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE_NOT_PERMITTED)"]; - * APP<PEER [label = "ATT Error Response", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GATTS_QUEUED_WRITE_BUF_NOAUTH_MSC GATTS Queued Writes: Stack handled, no attributes require authorization - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_REQUEST {BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES}"]; - * APP=>SD [label = "sd_ble_user_mem_reply {user_mem_block}"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #1 Attribute Values validation passed "]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: peer_value_1\nhandle_2: peer_value_2"]; - * APP<<=SD [label = "BLE_GATTS_EVT_WRITE {EXEC_WRITE_REQ_NOW}"]; - * APP rbox APP [label="App parses the memory it provided"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_RELEASE {user_mem_block}"]; - * |||; - * --- [label = " Variant #2 Attribute Values validation failed "]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD:>PEER [label = "ATT Error Response {Invalid Value Length / Offset}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_RELEASE {user_mem_block}"]; - * |||; - * @endmsc - * - * @defgroup BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC GATTS Queued Writes: Stack handled, one or more attributes require authorization - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_REQUEST {BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES}"]; - * APP=>SD [label = "sd_ble_user_mem_reply {user_mem_block}"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, PREP_WRITE_REQ, handle_2, offset_2, peer_value_2}"]; - * |||; - * --- [label = " Variant #1 App Authorizes both Prepare Write and Execute Write"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, EXEC_WRITE_REQ_NOW}"]; - * APP rbox APP [label="App parses the memory it provided"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: peer_value_1\nhandle_2: peer_value_2"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_RELEASE {user_mem_block}"]; - * |||; - * --- [label = " Variant #2 App Disallows Prepare Write and Authorizes Execute Write "]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, INSUF_AUTHORIZATION)"]; - * SD:>PEER [label = "ATT Error Response {Insufficient Authorization}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, EXEC_WRITE_REQ_NOW}"]; - * APP rbox APP [label="App parses the memory it provided"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: peer_value_1\nhandle_2: current_value_2"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_RELEASE {user_mem_block}"]; - * |||; - * --- [label = " Variant #3 App Authorizes Prepare Write and Disallows Execute Write "]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, EXEC_WRITE_REQ_NOW}"]; - * APP rbox APP [label="App parses the memory it provided"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, APP_ERROR_CODE)"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD:>PEER [label = "ATT Error Response {APP_ERROR_CODE}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_RELEASE {user_mem_block}"]; - * @endmsc - * - * @defgroup BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC GATTS Queued Writes: App handled, no attributes require authorization - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_REQUEST {BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES}"]; - * APP=>SD [label = "sd_ble_user_mem_reply {NULL}"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, PREP_WRITE_REQ, handle_1, offset_1, peer_value_1}"]; - * APP rbox APP [label="App queues {handle_1, offset_1, peer_value_1}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS, handle_1, offset_1, peer_value_1)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, PREP_WRITE_REQ, handle_2, offset_2, peer_value_2}"]; - * APP rbox APP [label="App queues {handle_2, offset_2, peer_value_2}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS, handle_2, offset_2, peer_value_2)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, EXEC_WRITE_REQ_NOW}"]; - * |||; - * --- [label = " Variant #1 Attribute values in stack memory (VLOC_STACK), attribute values validation passed "]; - * APP=>SD [label = "sd_ble_gatts_value_set {handle_1, offset_1, peer_value_1}"]; - * APP<SD [label = "sd_ble_gatts_value_set {handle_2, offset_2, peer_value_2}"]; - * APP<SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #2 Attribute values in user memory (VLOC_USER), attribute values validation passed "]; - * APP rbox APP [label="Application traverses its queue and executes the write operations (memcpy)"]; - * APP rbox APP [label="Values in ATT Table:\nhandle_1: peer_value_1\nhandle_2: peer_value_2"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #3 Attribute values validation failed "]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, INVALID_OFFSET)"]; - * APP rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD:>PEER [label = "ATT Error Response {Invalid Offset}", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC GATTS Queued Writes: App handled, one or more attributes require authorization - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP rbox APP [label="Values in ATT Table in user memory (VLOC_USER):\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_REQUEST {BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES}"]; - * APP=>SD [label = "sd_ble_user_mem_reply {NULL}"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, PREP_WRITE_REQ, handle_1, offset_1, peer_value_1}"]; - * APP rbox APP [label="App queues {handle_1, offset_1, peer_value_1}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS, handle_1, offset_1, peer_value_1)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, PREP_WRITE_REQ, handle_2, offset_2, peer_value_2}"]; - * |||; - * --- [label = " Variant #1 App Authorizes both Prepare Write and Execute Write"]; - * APP rbox APP [label="App queues {handle_2, offset_2, peer_value_2}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS, handle_2, offset_2, peer_value_2)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, EXEC_WRITE_REQ_NOW}"]; - * APP rbox APP [label="Application traverses its queue and executes the write operations (memcpy)"]; - * APP rbox APP [label="Values in ATT Table:\nhandle_1: peer_value_1\nhandle_2: peer_value_2"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #2 App Disallows Prepare Write and Authorizes Execute Write "]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, INSUF_AUTHORIZATION)"]; - * SD:>PEER [label = "ATT Error Response {Insufficient Authorization}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, EXEC_WRITE_REQ_NOW}"]; - * APP rbox APP [label="Application traverses its queue and executes the write operations (memcpy)"]; - * APP rbox APP [label="Values in ATT Table:\nhandle_1: peer_value_1\nhandle_2: current_value_2"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #3 App Authorizes Prepare Write and Disallows Execute Write "]; - * APP rbox APP [label="App queues {handle_2, offset_2, peer_value_2}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS, handle_2, offset_2, peer_value_2)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, EXEC_WRITE_REQ_NOW}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, APP_ERROR_CODE)"]; - * APP rbox APP [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD:>PEER [label = "ATT Error Response {APP_ERROR_CODE}", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC GATTS Queued Writes: Peer cancels operation - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_REQUEST {BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES}"]; - * |||; - * --- [label = " Variant #1 Stack handled "]; - * APP=>SD [label = "sd_ble_user_mem_reply {user_mem_block}"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {CANCEL}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_RELEASE {user_mem_block}"]; - * |||; - * --- [label = " Variant #2 App handled "]; - * APP=>SD [label = "sd_ble_user_mem_reply {NULL}"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, PREP_WRITE_REQ, handle_1, offset_1, peer_value_1}"]; - * APP rbox APP [label="App queues {handle_1, offset_1, peer_value_1}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS, handle_1, offset_1, peer_value_1)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, PREP_WRITE_REQ, handle_2, offset_2, peer_value_2}"]; - * APP rbox APP [label="App queues {handle_2, offset_2, peer_value_2}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS, handle_2, offset_2, peer_value_2)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {CANCEL}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, EXEC_WRITE_REQ_CANCEL}"]; - * APP rbox APP [label="App erases queue"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * @endmsc - * - * @defgroup BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC GATTS Queued Writes: Prepare Queue Full - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_REQUEST {BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES}"]; - * |||; - * --- [label = " Variant #1 Stack handled "]; - * APP=>SD [label = "sd_ble_user_mem_reply {user_mem_block}"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Error Response {Prepare Queue Full}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: peer_value_1\nhandle_2: current_value_2"]; - * APP<<=SD [label = "BLE_GATTS_EVT_WRITE {EXEC_WRITE_REQ_NOW}"]; - * APP rbox APP [label="App parses the memory it provided"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_EVT_USER_MEM_RELEASE {user_mem_block}"]; - * |||; - * --- [label = " Variant #2 App handled "]; - * APP=>SD [label = "sd_ble_user_mem_reply {NULL}"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, PREP_WRITE_REQ, handle_1, offset_1, peer_value_1}"]; - * APP rbox APP [label="App queues {handle_1, offset_1, peer_value_1}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS, handle_1, offset_1, peer_value_1)"]; - * SD:>PEER [label = "ATT Prepare Write Response {handle_1, offset_1, peer_value_1}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Prepare Write Request {handle_2, offset_2, peer_value_2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, PREP_WRITE_REQ, handle_2, offset_2, peer_value_2}"]; - * APP=>SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, PREPARE_QUEUE_FULL)"]; - * SD:>PEER [label = "ATT Error Response {Prepare Queue Full}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST {WRITE, EXEC_WRITE_REQ_NOW}"]; - * APP=>SD [label = "sd_ble_gatts_value_set {handle_1, offset_1, peer_value_1}"]; - * APP<SD [label = "sd_ble_gatts_rw_authorize_reply(WRITE, SUCCESS)"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: peer_value_1\nhandle_2: current_value_2"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GATTS_QUEUED_WRITE_EXECUTE_WITHOUT_PREPARE_MSC GATTS Queued Writes: Execute Write without Prepare Write - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * |||; - * SD rbox SD [label="No ATT Prepare Write Request has been received by SD"]; - * |||; - * --- [label = " Variant #1 Write cancelled "]; - * SD<:PEER [label = "ATT Execute Write Request {CANCEL}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * APP<<=SD [label = "BLE_GATTS_EVT_WRITE {EXEC_WRITE_REQ_CANCEL}"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * --- [label = " Variant #2 Write now "]; - * SD<:PEER [label = "ATT Execute Write Request {WRITE}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="Values in ATT Table:\nhandle_1: current_value_1\nhandle_2: current_value_2"]; - * APP<<=SD [label = "BLE_GATTS_EVT_WRITE {EXEC_WRITE_REQ_NOW}"]; - * SD:>PEER [label = "ATT Execute Write Response", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GATTS_MTU_EXCHANGE GATTS ATT_MTU Exchange - * @msc - * hscale = "2"; - * APP,SD,PEER; - * |||; - * APP=>SD [label = "sd_ble_cfg_set(BLE_CONN_CFG_GATT, gatt_conn_cfg.att_mtu=100)"]; - * APP<SD [label = "sd_ble_enable()"]; - * APP<SD [label = "sd_ble_gatts_exchange_mtu_reply(conn_handle, server_rx_mtu=75)"]; - * APP<PEER [label = "ATT Exchange MTU Response {server_rx_mtu=75}", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="att_mtu=75"]; - * @endmsc - * - * @defgroup BLE_GATTS_HVI_MSC GATTS Handle Value Indication - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP rbox PEER [label="Indications Enabled in CCCD"]; - * |||; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * APP=>SD [label = "sd_ble_gatts_hvx(INDICATION, app_value)"]; - * APP<PEER [label = "ATT Handle Value Indication {app_value}", textcolor="#000080", linecolor="#000080"]; - * --- [label = " Variant #1 Peer Confirms "]; - * SD<:PEER [label = "ATT Handle Value Confirmation", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_HVC"]; - * --- [label = " Variant #2 Peer Ignores "]; - * |||; - * ...; - * |||; - * SD box SD [label="Timeout"]; - * APP<<=SD [label = "BLE_GATTS_EVT_TIMEOUT"]; - * @endmsc - * - * @defgroup BLE_GATTS_HVN_MSC GATTS Handle Value Notification - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * --- [label = " Variant #1 App does not keep track of the available queue element count for notifications "]; - * APP note PEER [label = " This variant makes it possible for APP to transmit notifications without keeping track of the available queue element count. However, successful queuing of notifications cannot be guaranteed. "]; - * |||; - * APP=>SD [label = "sd_ble_enable()"]; - * APP<SD [label = "sd_ble_gatts_hvx(NOTIFICATION, app_value_1)"]; - * APP<SD [label = "sd_ble_gatts_hvx(NOTIFICATION, app_value_2)"]; - * APP<SD [label = "sd_ble_gatts_hvx(NOTIFICATION, app_value_3)"]; - * APP<SD [label = "sd_ble_gatts_hvx(NOTIFICATION, app_value_4)"]; - * APP<PEER [label = "ATT Handle Value Notification {app_value_1}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Handle Value Notification {app_value_2}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Handle Value Notification {app_value_4}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_HVN_TX_COMPLETE {3}"]; - * |||; - * --- [label = " Variant #2 App keeps track of the available queue element count for notifications "]; - * APP note PEER [label = " This variant makes it possible for APP to know when successful queuing of notifications is guaranteed. "]; - * |||; - * APP=>SD [label = "sd_ble_cfg_set(BLE_CONN_CFG_GATTS, gatts_conn_cfg.hvn_tx_queue_size=2)"]; - * APP<SD [label = "sd_ble_enable()"]; - * APP<SD [label = "sd_ble_gatts_hvx(NOTIFICATION, app_value_1)"]; - * APP<SD [label = "sd_ble_gatts_hvx(NOTIFICATION, app_value_2)"]; - * APP<PEER [label = "ATT Handle Value Notification {app_value_1}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_HVN_TX_COMPLETE {1}"]; - * APP abox APP [label="available_queue_element_count += 1"]; - * APP=>SD [label = "sd_ble_gatts_hvx(NOTIFICATION, app_value_3)"]; - * APP<PEER [label = "ATT Handle Value Notification {app_value_2}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_HVN_TX_COMPLETE {1}"]; - * APP abox APP [label="available_queue_element_count += 1"]; - * APP=>SD [label = "sd_ble_gatts_hvx(NOTIFICATION, app_value_4)"]; - * APP<PEER [label = "ATT Handle Value Notification {app_value_3}", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "ATT Handle Value Notification {app_value_4}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_HVN_TX_COMPLETE {2}"]; - * APP abox APP [label="available_queue_element_count += 2"]; - * @endmsc - * - * @defgroup BLE_GATTS_HVX_DISABLED_MSC GATTS Handle Value Indication or Notification disabled - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP rbox PEER [label="Indications and Notifications Disabled in CCCD"]; - * |||; - * SD rbox SD [label="Value in ATT Table: current_value"]; - * APP=>SD [label = "sd_ble_gatts_hvx(INDICATION or NOTIFICATION, app_value)"]; - * APP<SD [label = "sd_ble_gatts_hvx(INDICATION or NOTIFICATION, app_value)"]; - * APP<SD [label = "sd_ble_gatts_sys_attr_set()"]; - * APP<SD [label = "sd_ble_gatts_service_changed(N, M)"]; - * APP<PEER [label = "ATT Handle Value Indication {N, M}", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "ATT Handle Value Confirmation", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_SC_CONFIRM"]; - * |||; - * SD rbox PEER [label="Service Discovery"]; - * @endmsc - * - * @defgroup BLE_GATTS_SYS_ATTRS_UNK_PEER_MSC GATTS System Attributes Handling: Unknown Peer - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established with an Unknown Peer"]; - * |||; - * SD<:PEER [label = "ATT Read Request {sys_attr_handle}", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_GATTS_EVT_SYS_ATTR_MISSING"]; - * APP=>SD [label = "sd_ble_gatts_sys_attr_set(NULL)"]; - * APP<PEER [label = "ATT Read Response {sys_attr_value}", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * - * @defgroup BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC GATTS System Attributes Handling: Bonded Peer - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established with a Bonded Peer"]; - * |||; - * APP rbox PEER [label="ATT Traffic"]; - * |||; - * APP rbox PEER [label="Connection Terminated"]; - * APP<<=SD [label = "BLE_GAP_EVT_DISCONNECTED {reason}"]; - * |||; - * APP=>SD [label = "sd_ble_gatts_sys_attr_get()"]; - * APP<SD [label = "sd_ble_gatts_sys_attr_set(sys_attr_data)"]; - * APP<PEER [label = "ATT Read Response {sys_attr_value}", textcolor="#000080", linecolor="#000080"]; - * @endmsc - * @} - * - * @addtogroup BLE_GATTS_QUEUED_WRITES_USER_MEM User memory layout for Queued Writes - * @{ - * The following table shows the memory layout used by the SoftDevice to queue a Queued Write operation (Prepare Write ATT packet) in user memory: - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
Queued Write
ParameterSize (octets)Description
Handle2Attribute Handle
Offset2Value Offset
Length2Value Length
ValueLengthAttribute Value
- * - * The application can parse the array of Queued Write instances at any time, but it is recommended to do so whenever an Execute Write ATT packet - * has been received over the air. See the GATT Server Queued Writes MSCs for more details. - * The array will be terminated by an Queued Write instance with its handle set to @ref BLE_GATT_HANDLE_INVALID. - * @} - */ - - /** - * @addtogroup BLE_GATTS_SYS_ATTRS_FORMAT User memory layout for System Attributes - * @{ - * The following table shows the memory layout used by the SoftDevice to store a - * system attribute. - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
System Attribute
ParameterSize (octets)Description
Handle2Attribute handle
Length2Attribute length
DataLengthAttribute data
- * - * The application can obtain an array of system attributes by using @c sd_ble_gatts_sys_attr_get(). - * The array is terminated by a CRC-16-CCITT checksum of the data in the array. - * @} - * @} - */ - -/** - * @addtogroup BLE_L2CAP - * @{ - * @defgroup BLE_L2CAP_MSC Message Sequence Charts - * @{ - * @defgroup BLE_L2CAP_CH_SETUP_MSC L2CAP Channel Setup - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * --- [label = " Variant #1 Locally initiated, Establishment success "]; - * APP=>SD [label = "sd_ble_l2cap_ch_setup(conn_handle, local_cid=INVALID, le_psm, rx_mtu, rx_mps, sdu_buf: [len, p_data1])"]; - * APP<PEER [label = "L2CAP LE Credit Based Connection Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "L2CAP LE Credit Based Connection Response: Connection successful", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SETUP {conn_handle, local_cid, tx_mtu, tx_mps, credits}"]; - * |||; - * APP rbox PEER [label="L2CAP Channel Established"]; - * |||; - * --- [label = " Variant #2 Locally initiated, Establishment failure - PEER refusal "]; - * APP=>SD [label = "sd_ble_l2cap_ch_setup(conn_handle, local_cid=INVALID, le_psm, rx_mtu, rx_mps, sdu_buf: [len, p_data1])"]; - * APP<PEER [label = "L2CAP LE Credit Based Connection Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "L2CAP LE Credit Based Connection Response: Connection refused - no resources available", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED {conn_handle, local_cid, sdu_buf: [len, p_data1]}"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SETUP_REFUSED {conn_handle, local_cid, source: REMOTE, status: NO_RESOURCES}"]; - * |||; - * APP rbox PEER [label="L2CAP Channel NOT Established"]; - * |||; - * --- [label = " Variant #3 Locally initiated, Establishment failure - PEER does not respond "]; - * APP=>SD [label = "sd_ble_l2cap_ch_setup(conn_handle, local_cid=INVALID, le_psm, rx_mtu, rx_mps, sdu_buf: p_data=NULL)"]; - * APP<PEER [label = "L2CAP LE Credit Based Connection Request", textcolor="#000080", linecolor="#000080"]; - * SD abox SD [label="Timeout"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SETUP_REFUSED {conn_handle, local_cid, source: LOCAL, status: TIMEOUT}"]; - * |||; - * APP rbox PEER [label="L2CAP Channel NOT Established"]; - * |||; - * --- [label = " Variant #4 Remotely initiated, Establishment success "]; - * SD<:PEER [label = "L2CAP LE Credit Based Connection Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SETUP_REQUEST {conn_handle, local_cid, le_psm, tx_mtu, tx_mps, credits}"]; - * APP=>SD [label = "sd_ble_l2cap_ch_setup(conn_handle, local_cid, rx_mtu, rx_mps, sdu_buf: [len, p_data1], status: SUCCESS)"]; - * APP<PEER [label = "L2CAP LE Credit Based Connection Response: Connection successful", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox PEER [label="L2CAP Channel Established"]; - * |||; - * --- [label = " Variant #5 Remotely initiated, Establishment failure - APP refusal "]; - * SD<:PEER [label = "L2CAP LE Credit Based Connection Request", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SETUP_REQUEST {conn_handle, local_cid, le_psm, tx_mtu, tx_mps, credits}"]; - * APP=>SD [label = "sd_ble_l2cap_ch_setup(conn_handle, local_cid, status: LE_PSM_NOT_SUPPORTED)"]; - * APP<PEER [label = "L2CAP LE Credit Based Connection Response: Connection refused - LE_PSM not supported", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox PEER [label="L2CAP Channel NOT Established"]; - * |||; - * --- [label = " Variant #6 Remotely initiated, Establishment failure - SD refusal "]; - * SD<:PEER [label = "L2CAP LE Credit Based Connection Request", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="The limit of available L2CAP channels has been reached"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SETUP_REFUSED {conn_handle, local_cid=INVALID, source: LOCAL, status: NO_RESOURCES}"]; - * SD:>PEER [label = "L2CAP LE Credit Based Connection Response: Connection refused - no resources available", textcolor="#000080", linecolor="#000080"]; - * |||; - * APP rbox PEER [label="L2CAP Channel NOT Established"]; - * |||; - * @endmsc - * - * @defgroup BLE_L2CAP_CH_RELEASE_MSC L2CAP Channel Release - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP rbox PEER [label="Connection Established"]; - * |||; - * APP rbox PEER [label="L2CAP Channel Established"]; - * |||; - * --- [label = " Variant #1 Locally initiated, PEER responds "]; - * APP=>SD [label = "sd_ble_l2cap_ch_release(conn_handle, local_cid)"]; - * APP<PEER [label = "L2CAP Disconnection Request", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "L2CAP Disconnection Response", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="SD currently has three SDU data buffers supplied by APP"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED {conn_handle, local_cid, sdu_buf1}"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED {conn_handle, local_cid, sdu_buf2}"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED {conn_handle, local_cid, sdu_buf3}"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RELEASED {conn_handle, local_cid}"]; - * |||; - * --- [label = " Variant #2 Locally initiated, PEER does not respond "]; - * APP=>SD [label = "sd_ble_l2cap_ch_release(conn_handle, local_cid)"]; - * APP<PEER [label = "L2CAP Disconnection Request", textcolor="#000080", linecolor="#000080"]; - * SD abox SD [label="Timeout"]; - * SD rbox SD [label="SD does not currently have SDU data buffers supplied by APP"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RELEASED {conn_handle, local_cid}"]; - * |||; - * --- [label = " Variant #3 Remotely initiated "]; - * SD<:PEER [label = "L2CAP Disconnection Request", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="SD does not currently have SDU data buffers supplied by APP"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RELEASED {conn_handle, local_cid}"]; - * SD:>PEER [label = "L2CAP Disconnection Response", textcolor="#000080", linecolor="#000080"]; - * |||; - * @endmsc - * - * @defgroup BLE_L2CAP_CH_TX_MSC L2CAP Channel SDU Transmit - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * --- [label = " Variant #1 App ignores transmit credits, SD will transmit data as soon as possible "]; - * APP rbox PEER [label="L2CAP Channel Established, tx_queue_size=2, tx_mps=100, credits=2"]; - * |||; - * APP=>SD [label = "sd_ble_l2cap_ch_tx(conn_handle, local_cid, p_sdu_buf: [len=140, p_data1])"]; - * APP<SD [label = "sd_ble_l2cap_ch_tx(conn_handle, local_cid, p_sdu_buf: [len=80, p_data2])"]; - * APP<SD [label = "sd_ble_l2cap_ch_tx(conn_handle, local_cid, p_sdu_buf: [len=280, p_data3])"]; - * APP<PEER [label = "SDU 1, Segment 1", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "SDU 1, Segment 2", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_TX {conn_handle, local_cid, sdu_buf: [len=140, p_data1]}"]; - * APP abox APP [label="App releases memory pointed by p_data1"]; - * SD rbox SD [label="All credits consumed"]; - * APP=>SD [label = "sd_ble_l2cap_ch_tx(conn_handle, local_cid, p_sdu_buf: [len=280, p_data3])"]; - * APP<PEER [label = "SDU 2, Segment 1", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_TX {conn_handle, local_cid, sdu_buf: [len=80, p_data2]}"]; - * APP abox APP [label="App releases memory pointed by p_data2"]; - * SD:>PEER [label = "SDU 3, Segment 1", textcolor="#000080", linecolor="#000080"]; - * SD rbox SD [label="All credits consumed"]; - * ...; - * SD<:PEER [label = "LE Flow Control Credit (credits=2)", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_CREDIT {conn_handle, local_cid, credits=2}"]; - * SD:>PEER [label = "SDU 3, Segment 2", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "SDU 3, Segment 3", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_TX {conn_handle, local_cid, sdu_buf: [len=280, p_data3]}"]; - * APP abox APP [label="App releases memory pointed by p_data3"]; - * |||; - * --- [label = " Variant #2 App keeps track of transmission credits and transmits only if credits are available "]; - * APP rbox PEER [label="L2CAP Channel Established, tx_queue_size=2, tx_mps=100, credits=2"]; - * APP abox APP [label="available_credits = 2"]; - * |||; - * APP=>SD [label = "sd_ble_l2cap_ch_tx(conn_handle, local_cid, p_sdu_buf: [len=140, p_data1])"]; - * APP<PEER [label = "SDU 1, Segment 1", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "SDU 1, Segment 2", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_TX {conn_handle, local_cid, sdu_buf: [len=140, p_data1]}"]; - * APP abox APP [label="App releases memory pointed by p_data1"]; - * ...; - * SD<:PEER [label = "LE Flow Control Credit (credits=2)", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_CREDIT {conn_handle, local_cid, credits=2}"]; - * APP abox APP [label="available_credits += 2\n// available_credits == 2"]; - * APP=>SD [label = "sd_ble_l2cap_ch_tx(conn_handle, local_cid, p_sdu_buf: [len=80, p_data2])"]; - * APP<SD [label = "sd_ble_l2cap_ch_tx(conn_handle, local_cid, p_sdu_buf: [len=280, p_data3])"]; - * APP<PEER [label = "SDU 2, Segment 1", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_TX {conn_handle, local_cid, sdu_buf: [len=80, p_data2]}"]; - * APP abox APP [label="App releases memory pointed by p_data2"]; - * SD:>PEER [label = "SDU 3, Segment 1", textcolor="#000080", linecolor="#000080"]; - * ...; - * SD<:PEER [label = "LE Flow Control Credit (credits=2)", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_CREDIT {conn_handle, local_cid, credits=2}"]; - * APP abox APP [label="available_credits += 2\n// available_credits == 0"]; - * SD:>PEER [label = "SDU 3, Segment 2", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "SDU 3, Segment 3", textcolor="#000080", linecolor="#000080"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_TX {conn_handle, local_cid, sdu_buf: [len=280, p_data3]}"]; - * APP abox APP [label="App releases memory pointed by p_data3"]; - * |||; - * @endmsc - * - * @defgroup BLE_L2CAP_CH_RX_MSC L2CAP Channel SDU Receive - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP=>SD [label = "sd_ble_l2cap_ch_setup(rx_mtu=1000, rx_mps=100, sdu_buf: [len=1000, p_data1])"]; - * APP<PEER [label = "L2CAP LE Credit Based Connection Request (Initial Credits=1)", textcolor="#000080", linecolor="#000080"]; - * APP rbox PEER [label="L2CAP Channel Established, rx_queue_size=2, rx_mtu=1000, rx_mps=100"]; - * |||; - * APP=>SD [label = "sd_ble_l2cap_ch_rx(conn_handle, local_cid, p_sdu_buf: [len=1000, p_data2])"]; - * APP<PEER [label = "LE Flow Control Credit (credits=1)", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 1, Segment 1", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "LE Flow Control Credit (credits=1)", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 1, Segment 2", textcolor="#000080", linecolor="#000080"]; - * PEER rbox PEER [label="1 credit left"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RX {conn_handle, local_cid, sdu_len=140, sdu_buf: [len=1000, p_data1]}"]; - * APP abox APP [label="App can process data and release memory pointed by p_data1"]; - * APP=>SD [label = "sd_ble_l2cap_ch_rx(conn_handle, local_cid, p_sdu_buf: [len=1000, p_data3])"]; - * APP<PEER [label = "LE Flow Control Credit (credits=1)", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 2, Segment 1", textcolor="#000080", linecolor="#000080"]; - * PEER rbox PEER [label="1 credit left"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RX {conn_handle, local_cid, sdu_len=80, sdu_buf: [len=1000, p_data2]}"]; - * APP abox APP [label="App can process data and release memory pointed by p_data2"]; - * SD<:PEER [label = "SDU 3, Segment 1", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "LE Flow Control Credit (credits=2)", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 3, Segment 2", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 3, Segment 3", textcolor="#000080", linecolor="#000080"]; - * PEER rbox PEER [label="All credits consumed"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RX {conn_handle, local_cid, sdu_len=280, sdu_buf: [len=1000, p_data3]}"]; - * APP abox APP [label="App can process data and release memory pointed by p_data3"]; - * |||; - * @endmsc - * - * @defgroup BLE_L2CAP_CH_FLOW_CONTROL_MSC L2CAP Channel advanced SDU reception flow control - * @msc - * hscale = "1.5"; - * APP,SD,PEER; - * |||; - * APP=>SD [label = "sd_ble_l2cap_ch_setup(rx_mtu=1000, rx_mps=100, sdu_buf: p_data=NULL)"]; - * APP<PEER [label = "L2CAP LE Credit Based Connection Request (Initial Credits=0)", textcolor="#000080", linecolor="#000080"]; - * APP rbox PEER [label="L2CAP Channel Established, rx_queue_size=2, rx_mtu=1000, rx_mps=100"]; - * |||; - * --- [label = " Variant #1 App overwrites number of credits peer should have at the start of a SDU "]; - * APP=>SD [label = "sd_ble_l2cap_ch_flow_control(conn_handle, local_cid, credits=8)"]; - * APP<SD [label = "sd_ble_l2cap_ch_rx(conn_handle, local_cid, p_sdu_buf: [len=1000, p_data1])"]; - * APP<PEER [label = "LE Flow Control Credit (credits=8)", textcolor="#000080", linecolor="#000080"]; - * APP=>SD [label = "sd_ble_l2cap_ch_rx(conn_handle, local_cid, p_sdu_buf: [len=1000, p_data2])"]; - * APP<PEER [label = "LE Flow Control Credit (credits=2)", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 1, Segment 2", textcolor="#000080", linecolor="#000080"]; - * PEER rbox PEER [label="8 credits left"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RX {conn_handle, local_cid, sdu_len=140, sdu_buf: [len=1000, p_data1]}"]; - * APP abox APP [label="App can process data and release memory pointed by p_data1"]; - * APP=>SD [label = "sd_ble_l2cap_ch_rx(conn_handle, local_cid, p_sdu_buf: [len=1000, p_data3])"]; - * APP<PEER [label = "LE Flow Control Credit (credits=1)", textcolor="#000080", linecolor="#000080"]; - * PEER rbox PEER [label="8 credits left"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RX {conn_handle, local_cid, sdu_len=80, sdu_buf: [len=1000, p_data2]}"]; - * APP abox APP [label="App can process data and release memory pointed by p_data2"]; - * SD<:PEER [label = "SDU 3, Segment 1", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 3, Segment 2", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 3, Segment 3", textcolor="#000080", linecolor="#000080"]; - * PEER rbox PEER [label="5 credits left"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RX {conn_handle, local_cid, sdu_len=280, sdu_buf: [len=1000, p_data3]}"]; - * APP abox APP [label="App can process data and release memory pointed by p_data3"]; - * APP rbox APP [label="Peer has credits remaining so application must provide new reception buffer as soon as possible."]; - * |||; - * --- [label = " Variant #2 App pauses traffic on a L2CAP Channel "]; - * APP=>SD [label = "sd_ble_l2cap_ch_rx(conn_handle, local_cid, p_sdu_buf: [len=1000, p_data1])"]; - * APP<PEER [label = "LE Flow Control Credit (credits=1)", textcolor="#000080", linecolor="#000080"]; - * APP=>SD [label = "sd_ble_l2cap_ch_rx(conn_handle, local_cid, p_sdu_buf: [len=1000, p_data2])"]; - * APP<PEER [label = "LE Flow Control Credit (credits=1)", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 1, Segment 1", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "LE Flow Control Credit (credits=1)", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 1, Segment 2", textcolor="#000080", linecolor="#000080"]; - * PEER rbox PEER [label="1 credit left"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RX {conn_handle, local_cid, sdu_len=140, sdu_buf: [len=1000, p_data1]}"]; - * APP abox APP [label="App can process data and release memory pointed by p_data1"]; - * APP=>SD [label = "sd_ble_l2cap_ch_flow_control(conn_handle, local_cid, credits=0)"]; - * APP<SD [label = "sd_ble_l2cap_ch_rx(conn_handle, local_cid, p_sdu_buf: [len=1000, p_data3])"]; - * APP<SD [label = "sd_ble_l2cap_ch_flow_control(conn_handle, local_cid, credits=0)"]; - * APP<SD [label = "sd_ble_l2cap_ch_flow_control(conn_handle, local_cid, credits=BLE_L2CAP_CREDITS_DEFAULT)"]; - * APP<PEER [label = "LE Flow Control Credit (credits=1)", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 3, Segment 1", textcolor="#000080", linecolor="#000080"]; - * SD:>PEER [label = "LE Flow Control Credit (credits=2)", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 3, Segment 2", textcolor="#000080", linecolor="#000080"]; - * SD<:PEER [label = "SDU 3, Segment 3", textcolor="#000080", linecolor="#000080"]; - * PEER rbox PEER [label="All credits consumed"]; - * APP<<=SD [label = "BLE_L2CAP_EVT_CH_RX {conn_handle, local_cid, sdu_len=280, sdu_buf: [len=1000, p_data3]}"]; - * APP abox APP [label="App can process data and release memory pointed by p_data3"]; - * |||; - * @endmsc - * @} - * @} - */ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble.h deleted file mode 100644 index 470577b8aa..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble.h +++ /dev/null @@ -1,620 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above 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 Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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. - */ - -/** - @addtogroup BLE_COMMON BLE SoftDevice Common - @{ - @defgroup ble_api Events, type definitions and API calls - @{ - - @brief Module independent events, type definitions and API calls for the BLE SoftDevice. - - */ - -#ifndef BLE_H__ -#define BLE_H__ - -#include "ble_ranges.h" -#include "ble_types.h" -#include "ble_gap.h" -#include "ble_l2cap.h" -#include "ble_gatt.h" -#include "ble_gattc.h" -#include "ble_gatts.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_COMMON_ENUMERATIONS Enumerations - * @{ */ - -/** - * @brief Common API SVC numbers. - */ -enum BLE_COMMON_SVCS -{ - SD_BLE_ENABLE = BLE_SVC_BASE, /**< Enable and initialize the BLE stack */ - SD_BLE_EVT_GET, /**< Get an event from the pending events queue. */ - SD_BLE_UUID_VS_ADD, /**< Add a Vendor Specific UUID. */ - SD_BLE_UUID_DECODE, /**< Decode UUID bytes. */ - SD_BLE_UUID_ENCODE, /**< Encode UUID bytes. */ - SD_BLE_VERSION_GET, /**< Get the local version information (company ID, Link Layer Version, Link Layer Subversion). */ - SD_BLE_USER_MEM_REPLY, /**< User Memory Reply. */ - SD_BLE_OPT_SET, /**< Set a BLE option. */ - SD_BLE_OPT_GET, /**< Get a BLE option. */ - SD_BLE_CFG_SET, /**< Add a configuration to the BLE stack. */ -}; - -/** - * @brief BLE Module Independent Event IDs. - */ -enum BLE_COMMON_EVTS -{ - BLE_EVT_USER_MEM_REQUEST = BLE_EVT_BASE, /**< User Memory request. @ref ble_evt_user_mem_request_t */ - BLE_EVT_USER_MEM_RELEASE, /**< User Memory release. @ref ble_evt_user_mem_release_t */ -}; - -/**@brief BLE Connection Configuration IDs. - * - * IDs that uniquely identify a connection configuration. - */ -enum BLE_CONN_CFGS -{ - BLE_CONN_CFG_GAP = BLE_CONN_CFG_BASE, /**< BLE GAP specific connection configuration. */ - BLE_CONN_CFG_GATTC, /**< BLE GATTC specific connection configuration. */ - BLE_CONN_CFG_GATTS, /**< BLE GATTS specific connection configuration. */ - BLE_CONN_CFG_GATT, /**< BLE GATT specific connection configuration. */ - BLE_CONN_CFG_L2CAP, /**< BLE L2CAP specific connection configuration. */ -}; - -/**@brief BLE Common Configuration IDs. - * - * IDs that uniquely identify a common configuration. - */ -enum BLE_COMMON_CFGS -{ - BLE_COMMON_CFG_VS_UUID = BLE_CFG_BASE, /**< Vendor specific UUID configuration */ -}; - -/**@brief Common Option IDs. - * IDs that uniquely identify a common option. - */ -enum BLE_COMMON_OPTS -{ - BLE_COMMON_OPT_PA_LNA = BLE_OPT_BASE, /**< PA and LNA options */ - BLE_COMMON_OPT_CONN_EVT_EXT, /**< Extended connection events option */ -}; - -/** @} */ - -/** @addtogroup BLE_COMMON_DEFINES Defines - * @{ */ - -/** @brief Required pointer alignment for BLE Events. -*/ -#define BLE_EVT_PTR_ALIGNMENT 4 - -/** @brief Leaves the maximum of the two arguments. -*/ -#define BLE_MAX(a, b) ((a) < (b) ? (b) : (a)) - -/** @brief Maximum possible length for BLE Events. - * @note The highest value used for @ref ble_gatt_conn_cfg_t::att_mtu in any connection configuration shall be used as a parameter. - * If that value has not been configured for any connections then @ref BLE_GATT_ATT_MTU_DEFAULT must be used instead. -*/ -#define BLE_EVT_LEN_MAX(ATT_MTU) (BLE_MAX( \ - sizeof(ble_evt_t), \ - BLE_MAX( \ - offsetof(ble_evt_t, evt.gattc_evt.params.rel_disc_rsp.includes) + ((ATT_MTU) - 2) / 6 * sizeof(ble_gattc_include_t), \ - offsetof(ble_evt_t, evt.gattc_evt.params.attr_info_disc_rsp.info.attr_info16) + ((ATT_MTU) - 2) / 4 * sizeof(ble_gattc_attr_info16_t) \ - ) \ -)) - -/** @defgroup BLE_USER_MEM_TYPES User Memory Types - * @{ */ -#define BLE_USER_MEM_TYPE_INVALID 0x00 /**< Invalid User Memory Types. */ -#define BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES 0x01 /**< User Memory for GATTS queued writes. */ -/** @} */ - -/** @defgroup BLE_UUID_VS_COUNTS Vendor Specific UUID counts - * @{ - */ -#define BLE_UUID_VS_COUNT_DEFAULT 10 /**< Default VS UUID count. */ -#define BLE_UUID_VS_COUNT_MAX 254 /**< Maximum VS UUID count. */ -/** @} */ - -/** @defgroup BLE_COMMON_CFG_DEFAULTS Configuration defaults. - * @{ - */ -#define BLE_CONN_CFG_TAG_DEFAULT 0 /**< Default configuration tag, SoftDevice default connection configuration. */ - -/** @} */ - -/** @} */ - -/** @addtogroup BLE_COMMON_STRUCTURES Structures - * @{ */ - -/**@brief User Memory Block. */ -typedef struct -{ - uint8_t *p_mem; /**< Pointer to the start of the user memory block. */ - uint16_t len; /**< Length in bytes of the user memory block. */ -} ble_user_mem_block_t; - -/**@brief Event structure for @ref BLE_EVT_USER_MEM_REQUEST. */ -typedef struct -{ - uint8_t type; /**< User memory type, see @ref BLE_USER_MEM_TYPES. */ -} ble_evt_user_mem_request_t; - -/**@brief Event structure for @ref BLE_EVT_USER_MEM_RELEASE. */ -typedef struct -{ - uint8_t type; /**< User memory type, see @ref BLE_USER_MEM_TYPES. */ - ble_user_mem_block_t mem_block; /**< User memory block */ -} ble_evt_user_mem_release_t; - -/**@brief Event structure for events not associated with a specific function module. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which this event occurred. */ - union - { - ble_evt_user_mem_request_t user_mem_request; /**< User Memory Request Event Parameters. */ - ble_evt_user_mem_release_t user_mem_release; /**< User Memory Release Event Parameters. */ - } params; /**< Event parameter union. */ -} ble_common_evt_t; - -/**@brief BLE Event header. */ -typedef struct -{ - uint16_t evt_id; /**< Value from a BLE__EVT series. */ - uint16_t evt_len; /**< Length in octets including this header. */ -} ble_evt_hdr_t; - -/**@brief Common BLE Event type, wrapping the module specific event reports. */ -typedef struct -{ - ble_evt_hdr_t header; /**< Event header. */ - union - { - ble_common_evt_t common_evt; /**< Common Event, evt_id in BLE_EVT_* series. */ - ble_gap_evt_t gap_evt; /**< GAP originated event, evt_id in BLE_GAP_EVT_* series. */ - ble_gattc_evt_t gattc_evt; /**< GATT client originated event, evt_id in BLE_GATTC_EVT* series. */ - ble_gatts_evt_t gatts_evt; /**< GATT server originated event, evt_id in BLE_GATTS_EVT* series. */ - ble_l2cap_evt_t l2cap_evt; /**< L2CAP originated event, evt_id in BLE_L2CAP_EVT* series. */ - } evt; /**< Event union. */ -} ble_evt_t; - - -/** - * @brief Version Information. - */ -typedef struct -{ - uint8_t version_number; /**< Link Layer Version number. See https://www.bluetooth.org/en-us/specification/assigned-numbers/link-layer for assigned values. */ - uint16_t company_id; /**< Company ID, Nordic Semiconductor's company ID is 89 (0x0059) (https://www.bluetooth.org/apps/content/Default.aspx?doc_id=49708). */ - uint16_t subversion_number; /**< Link Layer Sub Version number, corresponds to the SoftDevice Config ID or Firmware ID (FWID). */ -} ble_version_t; - -/** - * @brief Configuration parameters for the PA and LNA. - */ -typedef struct -{ - uint8_t enable :1; /**< Enable toggling for this amplifier */ - uint8_t active_high :1; /**< Set the pin to be active high */ - uint8_t gpio_pin :6; /**< The GPIO pin to toggle for this amplifier */ -} ble_pa_lna_cfg_t; - -/** - * @brief PA & LNA GPIO toggle configuration - * - * This option configures the SoftDevice to toggle pins when the radio is active for use with a power amplifier and/or - * a low noise amplifier. - * - * Toggling the pins is achieved by using two PPI channels and a GPIOTE channel. The hardware channel IDs are provided - * by the application and should be regarded as reserved as long as any PA/LNA toggling is enabled. - * - * @note @ref sd_ble_opt_get is not supported for this option. - * @note Setting this option while the radio is in use (i.e. any of the roles are active) may have undefined consequences - * and must be avoided by the application. - */ -typedef struct -{ - ble_pa_lna_cfg_t pa_cfg; /**< Power Amplifier configuration */ - ble_pa_lna_cfg_t lna_cfg; /**< Low Noise Amplifier configuration */ - - uint8_t ppi_ch_id_set; /**< PPI channel used for radio pin setting */ - uint8_t ppi_ch_id_clr; /**< PPI channel used for radio pin clearing */ - uint8_t gpiote_ch_id; /**< GPIOTE channel used for radio pin toggling */ -} ble_common_opt_pa_lna_t; - -/** - * @brief Configuration of extended BLE connection events. - * - * When enabled the SoftDevice will dynamically extend the connection event when possible. - * - * The connection event length is controlled by the connection configuration as set by @ref ble_gap_conn_cfg_t::event_length. - * The connection event can be extended if there is time to send another packet pair before the start of the next connection interval, - * and if there are no conflicts with other BLE roles requesting radio time. - * - * @note @ref sd_ble_opt_get is not supported for this option. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable extended BLE connection events, disabled by default. */ -} ble_common_opt_conn_evt_ext_t; - -/**@brief Option structure for common options. */ -typedef union -{ - ble_common_opt_pa_lna_t pa_lna; /**< Parameters for controlling PA and LNA pin toggling. */ - ble_common_opt_conn_evt_ext_t conn_evt_ext; /**< Parameters for enabling extended connection events. */ -} ble_common_opt_t; - -/**@brief Common BLE Option type, wrapping the module specific options. */ -typedef union -{ - ble_common_opt_t common_opt; /**< COMMON options, opt_id in @ref BLE_COMMON_OPTS series. */ - ble_gap_opt_t gap_opt; /**< GAP option, opt_id in @ref BLE_GAP_OPTS series. */ -} ble_opt_t; - -/**@brief BLE connection configuration type, wrapping the module specific configurations, set with - * @ref sd_ble_cfg_set. - * - * @note Connection configurations don't have to be set. - * In the case that no configurations has been set, or fewer connection configurations has been set than enabled connections, - * the default connection configuration will be automatically added for the remaining connections. - * When creating connections with the default configuration, @ref BLE_CONN_CFG_TAG_DEFAULT should be used in - * place of @ref ble_conn_cfg_t::conn_cfg_tag. See @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect()" - * - * @mscs - * @mmsc{@ref BLE_CONN_CFG} - * @endmscs - - */ -typedef struct -{ - uint8_t conn_cfg_tag; /**< The application chosen tag it can use with the @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect() - calls to select this configuration when creating a connection. - Must be different for all connection configurations added and not @ref BLE_CONN_CFG_TAG_DEFAULT. */ - union { - ble_gap_conn_cfg_t gap_conn_cfg; /**< GAP connection configuration, cfg_id is @ref BLE_CONN_CFG_GAP. */ - ble_gattc_conn_cfg_t gattc_conn_cfg; /**< GATTC connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTC. */ - ble_gatts_conn_cfg_t gatts_conn_cfg; /**< GATTS connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTS. */ - ble_gatt_conn_cfg_t gatt_conn_cfg; /**< GATT connection configuration, cfg_id is @ref BLE_CONN_CFG_GATT. */ - ble_l2cap_conn_cfg_t l2cap_conn_cfg; /**< L2CAP connection configuration, cfg_id is @ref BLE_CONN_CFG_L2CAP. */ - } params; /**< Connection configuration union. */ -} ble_conn_cfg_t; - -/** - * @brief Configuration of Vendor Specific UUIDs, set with @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_INVALID_PARAM Too many UUIDs configured. - */ -typedef struct -{ - uint8_t vs_uuid_count; /**< Number of 128-bit Vendor Specific UUID bases to allocate memory for. - Default value is @ref BLE_UUID_VS_COUNT_DEFAULT. Maximum value is - @ref BLE_UUID_VS_COUNT_MAX. */ -} ble_common_cfg_vs_uuid_t; - -/**@brief Common BLE Configuration type, wrapping the common configurations. */ -typedef union -{ - ble_common_cfg_vs_uuid_t vs_uuid_cfg; /**< Vendor specific UUID configuration, cfg_id is @ref BLE_COMMON_CFG_VS_UUID. */ -} ble_common_cfg_t; - -/**@brief BLE Configuration type, wrapping the module specific configurations. */ -typedef union -{ - ble_conn_cfg_t conn_cfg; /**< Connection specific configurations, cfg_id in @ref BLE_CONN_CFGS series. */ - ble_common_cfg_t common_cfg; /**< Global common configurations, cfg_id in @ref BLE_COMMON_CFGS series. */ - ble_gap_cfg_t gap_cfg; /**< Global GAP configurations, cfg_id in @ref BLE_GAP_CFGS series. */ - ble_gatts_cfg_t gatts_cfg; /**< Global GATTS configuration, cfg_id in @ref BLE_GATTS_CFGS series. */ -} ble_cfg_t; - -/** @} */ - -/** @addtogroup BLE_COMMON_FUNCTIONS Functions - * @{ */ - -/**@brief Enable the BLE stack - * - * @param[in, out] p_app_ram_base Pointer to a variable containing the start address of the - * application RAM region (APP_RAM_BASE). On return, this will - * contain the minimum start address of the application RAM region - * required by the SoftDevice for this configuration. - * - * @note The memory requirement for a specific configuration will not increase between SoftDevices - * with the same major version number. - * - * @note The value of *p_app_ram_base when the app has done no custom configuration of the - * SoftDevice, i.e. the app has not called @ref sd_ble_cfg_set before @ref sd_ble_enable, can - * be found in the release notes. - * - * @note At runtime the IC's RAM is split into 2 regions: The SoftDevice RAM region is located - * between 0x20000000 and APP_RAM_BASE-1 and the application's RAM region is located between - * APP_RAM_BASE and the start of the call stack. - * - * @details This call initializes the BLE stack, no BLE related function other than @ref - * sd_ble_cfg_set can be called before this one. - * - * @mscs - * @mmsc{@ref BLE_COMMON_ENABLE} - * @endmscs - * - * @retval ::NRF_SUCCESS The BLE stack has been initialized successfully. - * @retval ::NRF_ERROR_INVALID_STATE The BLE stack had already been initialized and cannot be reinitialized. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. - * @retval ::NRF_ERROR_NO_MEM The amount of memory assigned to the SoftDevice by *p_app_ram_base is not - * large enough to fit this configuration's memory requirement. Check *p_app_ram_base - * and set the start address of the application RAM region accordingly. - */ -SVCALL(SD_BLE_ENABLE, uint32_t, sd_ble_enable(uint32_t * p_app_ram_base)); - -/**@brief Add configurations for the BLE stack - * - * @param[in] cfg_id Config ID, see @ref BLE_CONN_CFGS, @ref BLE_COMMON_CFGS, @ref - * BLE_GAP_CFGS or @ref BLE_GATTS_CFGS. - * @param[in] p_cfg Pointer to a ble_cfg_t structure containing the configuration value. - * @param[in] app_ram_base The start address of the application RAM region (APP_RAM_BASE). - * See @ref sd_ble_enable for details about APP_RAM_BASE. - * - * @note The memory requirement for a specific configuration will not increase between SoftDevices - * with the same major version number. - * - * @note If a configuration is set more than once, the last one set is the one that takes effect on - * @ref sd_ble_enable. - * - * @note Any part of the BLE stack that is NOT configured with @ref sd_ble_cfg_set will have default - * configuration. - * - * @note @ref sd_ble_cfg_set may be called at any time when the SoftDevice is enabled (see @ref - * sd_softdevice_enable) while the BLE part of the SoftDevice is not enabled (see @ref - * sd_ble_enable). - * - * @note Error codes for the configurations are described in the configuration structs. - * - * @mscs - * @mmsc{@ref BLE_COMMON_ENABLE} - * @endmscs - * - * @retval ::NRF_SUCCESS The configuration has been added successfully. - * @retval ::NRF_ERROR_INVALID_STATE The BLE stack had already been initialized. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid cfg_id supplied. - * @retval ::NRF_ERROR_NO_MEM The amount of memory assigned to the SoftDevice by app_ram_base is not - * large enough to fit this configuration's memory requirement. - */ -SVCALL(SD_BLE_CFG_SET, uint32_t, sd_ble_cfg_set(uint32_t cfg_id, ble_cfg_t const * p_cfg, uint32_t app_ram_base)); - -/**@brief Get an event from the pending events queue. - * - * @param[out] p_dest Pointer to buffer to be filled in with an event, or NULL to retrieve the event length. - * This buffer must be aligned to the extend defined by @ref BLE_EVT_PTR_ALIGNMENT. - * The buffer should be interpreted as a @ref ble_evt_t struct. - * @param[in, out] p_len Pointer the length of the buffer, on return it is filled with the event length. - * - * @details This call allows the application to pull a BLE event from the BLE stack. The application is signaled that - * an event is available from the BLE stack by the triggering of the SD_EVT_IRQn interrupt. - * The application is free to choose whether to call this function from thread mode (main context) or directly from the - * Interrupt Service Routine that maps to SD_EVT_IRQn. In any case however, and because the BLE stack runs at a higher - * priority than the application, this function should be called in a loop (until @ref NRF_ERROR_NOT_FOUND is returned) - * every time SD_EVT_IRQn is raised to ensure that all available events are pulled from the BLE stack. Failure to do so - * could potentially leave events in the internal queue without the application being aware of this fact. - * - * Sizing the p_dest buffer is equally important, since the application needs to provide all the memory necessary for the event to - * be copied into application memory. If the buffer provided is not large enough to fit the entire contents of the event, - * @ref NRF_ERROR_DATA_SIZE will be returned and the application can then call again with a larger buffer size. - * The maximum possible event length is defined by @ref BLE_EVT_LEN_MAX. The application may also "peek" the event length - * by providing p_dest as a NULL pointer and inspecting the value of *p_len upon return: - * - * \code - * uint16_t len; - * errcode = sd_ble_evt_get(NULL, &len); - * \endcode - * - * @mscs - * @mmsc{@ref BLE_COMMON_IRQ_EVT_MSC} - * @mmsc{@ref BLE_COMMON_THREAD_EVT_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Event pulled and stored into the supplied buffer. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied. - * @retval ::NRF_ERROR_NOT_FOUND No events ready to be pulled. - * @retval ::NRF_ERROR_DATA_SIZE Event ready but could not fit into the supplied buffer. - */ -SVCALL(SD_BLE_EVT_GET, uint32_t, sd_ble_evt_get(uint8_t *p_dest, uint16_t *p_len)); - - -/**@brief Add a Vendor Specific base UUID. - * - * @details This call enables the application to add a vendor specific base UUID to the BLE stack's table, for later - * use with all other modules and APIs. This then allows the application to use the shorter, 24-bit @ref ble_uuid_t - * format when dealing with both 16-bit and 128-bit UUIDs without having to check for lengths and having split code - * paths. This is accomplished by extending the grouping mechanism that the Bluetooth SIG standard base UUID uses - * for all other 128-bit UUIDs. The type field in the @ref ble_uuid_t structure is an index (relative to - * @ref BLE_UUID_TYPE_VENDOR_BEGIN) to the table populated by multiple calls to this function, and the UUID field - * in the same structure contains the 2 bytes at indexes 12 and 13. The number of possible 128-bit UUIDs available to - * the application is therefore the number of Vendor Specific UUIDs added with the help of this function times 65536, - * although restricted to modifying bytes 12 and 13 for each of the entries in the supplied array. - * - * @note Bytes 12 and 13 of the provided UUID will not be used internally, since those are always replaced by - * the 16-bit uuid field in @ref ble_uuid_t. - * - * @note If a UUID is already present in the BLE stack's internal table, the corresponding index will be returned in - * p_uuid_type along with an NRF_SUCCESS error code. - * - * @param[in] p_vs_uuid Pointer to a 16-octet (128-bit) little endian Vendor Specific UUID disregarding - * bytes 12 and 13. - * @param[out] p_uuid_type Pointer to a uint8_t where the type field in @ref ble_uuid_t corresponding to this UUID will be stored. - * - * @retval ::NRF_SUCCESS Successfully added the Vendor Specific UUID. - * @retval ::NRF_ERROR_INVALID_ADDR If p_vs_uuid or p_uuid_type is NULL or invalid. - * @retval ::NRF_ERROR_NO_MEM If there are no more free slots for VS UUIDs. - */ -SVCALL(SD_BLE_UUID_VS_ADD, uint32_t, sd_ble_uuid_vs_add(ble_uuid128_t const *p_vs_uuid, uint8_t *p_uuid_type)); - - -/** @brief Decode little endian raw UUID bytes (16-bit or 128-bit) into a 24 bit @ref ble_uuid_t structure. - * - * @details The raw UUID bytes excluding bytes 12 and 13 (i.e. bytes 0-11 and 14-15) of p_uuid_le are compared - * to the corresponding ones in each entry of the table of vendor specific UUIDs populated with @ref sd_ble_uuid_vs_add - * to look for a match. If there is such a match, bytes 12 and 13 are returned as p_uuid->uuid and the index - * relative to @ref BLE_UUID_TYPE_VENDOR_BEGIN as p_uuid->type. - * - * @note If the UUID length supplied is 2, then the type set by this call will always be @ref BLE_UUID_TYPE_BLE. - * - * @param[in] uuid_le_len Length in bytes of the buffer pointed to by p_uuid_le (must be 2 or 16 bytes). - * @param[in] p_uuid_le Pointer pointing to little endian raw UUID bytes. - * @param[out] p_uuid Pointer to a @ref ble_uuid_t structure to be filled in. - * - * @retval ::NRF_SUCCESS Successfully decoded into the @ref ble_uuid_t structure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid UUID length. - * @retval ::NRF_ERROR_NOT_FOUND For a 128-bit UUID, no match in the populated table of UUIDs. - */ -SVCALL(SD_BLE_UUID_DECODE, uint32_t, sd_ble_uuid_decode(uint8_t uuid_le_len, uint8_t const *p_uuid_le, ble_uuid_t *p_uuid)); - - -/** @brief Encode a @ref ble_uuid_t structure into little endian raw UUID bytes (16-bit or 128-bit). - * - * @note The pointer to the destination buffer p_uuid_le may be NULL, in which case only the validity and size of p_uuid is computed. - * - * @param[in] p_uuid Pointer to a @ref ble_uuid_t structure that will be encoded into bytes. - * @param[out] p_uuid_le_len Pointer to a uint8_t that will be filled with the encoded length (2 or 16 bytes). - * @param[out] p_uuid_le Pointer to a buffer where the little endian raw UUID bytes (2 or 16) will be stored. - * - * @retval ::NRF_SUCCESS Successfully encoded into the buffer. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid UUID type. - */ -SVCALL(SD_BLE_UUID_ENCODE, uint32_t, sd_ble_uuid_encode(ble_uuid_t const *p_uuid, uint8_t *p_uuid_le_len, uint8_t *p_uuid_le)); - - -/**@brief Get Version Information. - * - * @details This call allows the application to get the BLE stack version information. - * - * @param[out] p_version Pointer to a ble_version_t structure to be filled in. - * - * @retval ::NRF_SUCCESS Version information stored successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY The BLE stack is busy (typically doing a locally-initiated disconnection procedure). - */ -SVCALL(SD_BLE_VERSION_GET, uint32_t, sd_ble_version_get(ble_version_t *p_version)); - - -/**@brief Provide a user memory block. - * - * @note This call can only be used as a response to a @ref BLE_EVT_USER_MEM_REQUEST event issued to the application. - * - * @param[in] conn_handle Connection handle. - * @param[in] p_block Pointer to a user memory block structure or NULL if memory is managed by the application. - * - * @mscs - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Successfully queued a response to the peer. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid user memory block length supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection state or no user memory request pending. - */ -SVCALL(SD_BLE_USER_MEM_REPLY, uint32_t, sd_ble_user_mem_reply(uint16_t conn_handle, ble_user_mem_block_t const *p_block)); - -/**@brief Set a BLE option. - * - * @details This call allows the application to set the value of an option. - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_STATIC_PK_MSC} - * @endmscs - * - * @param[in] opt_id Option ID, see @ref BLE_COMMON_OPTS and @ref BLE_GAP_OPTS. - * @param[in] p_opt Pointer to a ble_opt_t structure containing the option value. - * - * @retval ::NRF_SUCCESS Option set successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. - * @retval ::NRF_ERROR_INVALID_STATE Unable to set the parameter at this time. - * @retval ::NRF_ERROR_BUSY The BLE stack is busy or the previous procedure has not completed. - */ -SVCALL(SD_BLE_OPT_SET, uint32_t, sd_ble_opt_set(uint32_t opt_id, ble_opt_t const *p_opt)); - - -/**@brief Get a BLE option. - * - * @details This call allows the application to retrieve the value of an option. - * - * @param[in] opt_id Option ID, see @ref BLE_COMMON_OPTS and @ref BLE_GAP_OPTS. - * @param[out] p_opt Pointer to a ble_opt_t structure to be filled in. - * - * @retval ::NRF_SUCCESS Option retrieved successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. - * @retval ::NRF_ERROR_INVALID_STATE Unable to retrieve the parameter at this time. - * @retval ::NRF_ERROR_BUSY The BLE stack is busy or the previous procedure has not completed. - * @retval ::NRF_ERROR_NOT_SUPPORTED This option is not supported. - * - */ -SVCALL(SD_BLE_OPT_GET, uint32_t, sd_ble_opt_get(uint32_t opt_id, ble_opt_t *p_opt)); - -/** @} */ -#ifdef __cplusplus -} -#endif -#endif /* BLE_H__ */ - -/** - @} - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_err.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_err.h deleted file mode 100644 index 1b0b9d4435..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_err.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above 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 Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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. - */ - -/** - @addtogroup BLE_COMMON - @{ - @addtogroup nrf_error - @{ - @ingroup BLE_COMMON - @} - - @defgroup ble_err General error codes - @{ - - @brief General error code definitions for the BLE API. - - @ingroup BLE_COMMON -*/ -#ifndef NRF_BLE_ERR_H__ -#define NRF_BLE_ERR_H__ - -#include "nrf_error.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* @defgroup BLE_ERRORS Error Codes - * @{ */ -#define BLE_ERROR_NOT_ENABLED (NRF_ERROR_STK_BASE_NUM+0x001) /**< @ref sd_ble_enable has not been called. */ -#define BLE_ERROR_INVALID_CONN_HANDLE (NRF_ERROR_STK_BASE_NUM+0x002) /**< Invalid connection handle. */ -#define BLE_ERROR_INVALID_ATTR_HANDLE (NRF_ERROR_STK_BASE_NUM+0x003) /**< Invalid attribute handle. */ -#define BLE_ERROR_INVALID_ROLE (NRF_ERROR_STK_BASE_NUM+0x004) /**< Invalid role. */ -/** @} */ - - -/** @defgroup BLE_ERROR_SUBRANGES Module specific error code subranges - * @brief Assignment of subranges for module specific error codes. - * @note For specific error codes, see ble_.h or ble_error_.h. - * @{ */ -#define NRF_L2CAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x100) /**< L2CAP specific errors. */ -#define NRF_GAP_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x200) /**< GAP specific errors. */ -#define NRF_GATTC_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x300) /**< GATT client specific errors. */ -#define NRF_GATTS_ERR_BASE (NRF_ERROR_STK_BASE_NUM+0x400) /**< GATT server specific errors. */ -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif - - -/** - @} - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gap.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gap.h deleted file mode 100644 index 13f7721c58..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gap.h +++ /dev/null @@ -1,2170 +0,0 @@ -/* - * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above 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 Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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. - */ - -/** - @addtogroup BLE_GAP Generic Access Profile (GAP) - @{ - @brief Definitions and prototypes for the GAP interface. - */ - -#ifndef BLE_GAP_H__ -#define BLE_GAP_H__ - - -#include "ble_types.h" -#include "ble_ranges.h" -#include "nrf_svc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup BLE_GAP_ENUMERATIONS Enumerations - * @{ */ - -/**@brief GAP API SVC numbers. - */ -enum BLE_GAP_SVCS -{ - SD_BLE_GAP_ADDR_SET = BLE_GAP_SVC_BASE, /**< Set own Bluetooth Address. */ - SD_BLE_GAP_ADDR_GET, /**< Get own Bluetooth Address. */ - SD_BLE_GAP_WHITELIST_SET, /**< Set active whitelist. */ - SD_BLE_GAP_DEVICE_IDENTITIES_SET, /**< Set device identity list. */ - SD_BLE_GAP_PRIVACY_SET, /**< Set Privacy settings*/ - SD_BLE_GAP_PRIVACY_GET, /**< Get Privacy settings*/ - SD_BLE_GAP_ADV_DATA_SET, /**< Set Advertising Data. */ - SD_BLE_GAP_ADV_START, /**< Start Advertising. */ - SD_BLE_GAP_ADV_STOP, /**< Stop Advertising. */ - SD_BLE_GAP_CONN_PARAM_UPDATE, /**< Connection Parameter Update. */ - SD_BLE_GAP_DISCONNECT, /**< Disconnect. */ - SD_BLE_GAP_TX_POWER_SET, /**< Set TX Power. */ - SD_BLE_GAP_APPEARANCE_SET, /**< Set Appearance. */ - SD_BLE_GAP_APPEARANCE_GET, /**< Get Appearance. */ - SD_BLE_GAP_PPCP_SET, /**< Set PPCP. */ - SD_BLE_GAP_PPCP_GET, /**< Get PPCP. */ - SD_BLE_GAP_DEVICE_NAME_SET, /**< Set Device Name. */ - SD_BLE_GAP_DEVICE_NAME_GET, /**< Get Device Name. */ - SD_BLE_GAP_AUTHENTICATE, /**< Initiate Pairing/Bonding. */ - SD_BLE_GAP_SEC_PARAMS_REPLY, /**< Reply with Security Parameters. */ - SD_BLE_GAP_AUTH_KEY_REPLY, /**< Reply with an authentication key. */ - SD_BLE_GAP_LESC_DHKEY_REPLY, /**< Reply with an LE Secure Connections DHKey. */ - SD_BLE_GAP_KEYPRESS_NOTIFY, /**< Notify of a keypress during an authentication procedure. */ - SD_BLE_GAP_LESC_OOB_DATA_GET, /**< Get the local LE Secure Connections OOB data. */ - SD_BLE_GAP_LESC_OOB_DATA_SET, /**< Set the remote LE Secure Connections OOB data. */ - SD_BLE_GAP_ENCRYPT, /**< Initiate encryption procedure. */ - SD_BLE_GAP_SEC_INFO_REPLY, /**< Reply with Security Information. */ - SD_BLE_GAP_CONN_SEC_GET, /**< Obtain connection security level. */ - SD_BLE_GAP_RSSI_START, /**< Start reporting of changes in RSSI. */ - SD_BLE_GAP_RSSI_STOP, /**< Stop reporting of changes in RSSI. */ - SD_BLE_GAP_SCAN_START, /**< Start Scanning. */ - SD_BLE_GAP_SCAN_STOP, /**< Stop Scanning. */ - SD_BLE_GAP_CONNECT, /**< Connect. */ - SD_BLE_GAP_CONNECT_CANCEL, /**< Cancel ongoing connection procedure. */ - SD_BLE_GAP_RSSI_GET, /**< Get the last RSSI sample. */ - SD_BLE_GAP_PHY_UPDATE, /**< Initiate or respond to a PHY Update Procedure. */ - SD_BLE_GAP_DATA_LENGTH_UPDATE, /**< Initiate or respond to a Data Length Update Procedure. */ -}; - -/**@brief GAP Event IDs. - * IDs that uniquely identify an event coming from the stack to the application. - */ -enum BLE_GAP_EVTS -{ - BLE_GAP_EVT_CONNECTED = BLE_GAP_EVT_BASE, /**< Connection established. \n See @ref ble_gap_evt_connected_t. */ - BLE_GAP_EVT_DISCONNECTED, /**< Disconnected from peer. \n See @ref ble_gap_evt_disconnected_t. */ - BLE_GAP_EVT_CONN_PARAM_UPDATE, /**< Connection Parameters updated. \n See @ref ble_gap_evt_conn_param_update_t. */ - BLE_GAP_EVT_SEC_PARAMS_REQUEST, /**< Request to provide security parameters. \n Reply with @ref sd_ble_gap_sec_params_reply. \n See @ref ble_gap_evt_sec_params_request_t. */ - BLE_GAP_EVT_SEC_INFO_REQUEST, /**< Request to provide security information. \n Reply with @ref sd_ble_gap_sec_info_reply. \n See @ref ble_gap_evt_sec_info_request_t. */ - BLE_GAP_EVT_PASSKEY_DISPLAY, /**< Request to display a passkey to the user. \n In LESC Numeric Comparison, reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_passkey_display_t. */ - BLE_GAP_EVT_KEY_PRESSED, /**< Notification of a keypress on the remote device.\n See @ref ble_gap_evt_key_pressed_t */ - BLE_GAP_EVT_AUTH_KEY_REQUEST, /**< Request to provide an authentication key. \n Reply with @ref sd_ble_gap_auth_key_reply. \n See @ref ble_gap_evt_auth_key_request_t. */ - BLE_GAP_EVT_LESC_DHKEY_REQUEST, /**< Request to calculate an LE Secure Connections DHKey. \n Reply with @ref sd_ble_gap_lesc_dhkey_reply. \n See @ref ble_gap_evt_lesc_dhkey_request_t */ - BLE_GAP_EVT_AUTH_STATUS, /**< Authentication procedure completed with status. \n See @ref ble_gap_evt_auth_status_t. */ - BLE_GAP_EVT_CONN_SEC_UPDATE, /**< Connection security updated. \n See @ref ble_gap_evt_conn_sec_update_t. */ - BLE_GAP_EVT_TIMEOUT, /**< Timeout expired. \n See @ref ble_gap_evt_timeout_t. */ - BLE_GAP_EVT_RSSI_CHANGED, /**< RSSI report. \n See @ref ble_gap_evt_rssi_changed_t. */ - BLE_GAP_EVT_ADV_REPORT, /**< Advertising report. \n See @ref ble_gap_evt_adv_report_t. */ - BLE_GAP_EVT_SEC_REQUEST, /**< Security Request. \n See @ref ble_gap_evt_sec_request_t. */ - BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST, /**< Connection Parameter Update Request. \n Reply with @ref sd_ble_gap_conn_param_update. \n See @ref ble_gap_evt_conn_param_update_request_t. */ - BLE_GAP_EVT_SCAN_REQ_REPORT, /**< Scan request report. \n See @ref ble_gap_evt_scan_req_report_t. */ - BLE_GAP_EVT_PHY_UPDATE_REQUEST, /**< PHY Update Request. \n Reply with @ref sd_ble_gap_phy_update. \n See @ref ble_gap_evt_phy_update_request_t. */ - BLE_GAP_EVT_PHY_UPDATE, /**< PHY Update Procedure is complete. \n See @ref ble_gap_evt_phy_update_t. */ - BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST, /**< Data Length Update Request. \n Reply with @ref sd_ble_gap_data_length_update.\n See @ref ble_gap_evt_data_length_update_request_t. */ - BLE_GAP_EVT_DATA_LENGTH_UPDATE, /**< LL Data Channel PDU payload length updated. \n See @ref ble_gap_evt_data_length_update_t. */ -}; - -/**@brief GAP Option IDs. - * IDs that uniquely identify a GAP option. - */ -enum BLE_GAP_OPTS -{ - BLE_GAP_OPT_CH_MAP = BLE_GAP_OPT_BASE, /**< Channel Map. @ref ble_gap_opt_ch_map_t */ - BLE_GAP_OPT_LOCAL_CONN_LATENCY, /**< Local connection latency. @ref ble_gap_opt_local_conn_latency_t */ - BLE_GAP_OPT_PASSKEY, /**< Set passkey. @ref ble_gap_opt_passkey_t */ - BLE_GAP_OPT_SCAN_REQ_REPORT, /**< Scan request report. @ref ble_gap_opt_scan_req_report_t */ - BLE_GAP_OPT_COMPAT_MODE_1, /**< Compatibility mode. @ref ble_gap_opt_compat_mode_1_t */ - BLE_GAP_OPT_AUTH_PAYLOAD_TIMEOUT, /**< Set Authenticated payload timeout. @ref ble_gap_opt_auth_payload_timeout_t */ - BLE_GAP_OPT_SLAVE_LATENCY_DISABLE, /**< Disable slave latency. @ref ble_gap_opt_slave_latency_disable_t */ -}; - -/**@brief GAP Configuration IDs. - * - * IDs that uniquely identify a GAP configuration. - */ -enum BLE_GAP_CFGS -{ - BLE_GAP_CFG_ROLE_COUNT = BLE_GAP_CFG_BASE, /**< Role count configuration. */ - BLE_GAP_CFG_DEVICE_NAME, /**< Device name configuration. */ -}; - -/** @} */ - -/**@addtogroup BLE_GAP_DEFINES Defines - * @{ */ - -/**@defgroup BLE_ERRORS_GAP SVC return values specific to GAP - * @{ */ -#define BLE_ERROR_GAP_UUID_LIST_MISMATCH (NRF_GAP_ERR_BASE + 0x000) /**< UUID list does not contain an integral number of UUIDs. */ -#define BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST (NRF_GAP_ERR_BASE + 0x001) /**< Use of Whitelist not permitted with discoverable advertising. */ -#define BLE_ERROR_GAP_INVALID_BLE_ADDR (NRF_GAP_ERR_BASE + 0x002) /**< The upper two bits of the address do not correspond to the specified address type. */ -#define BLE_ERROR_GAP_WHITELIST_IN_USE (NRF_GAP_ERR_BASE + 0x003) /**< Attempt to modify the whitelist while already in use by another operation. */ -#define BLE_ERROR_GAP_DEVICE_IDENTITIES_IN_USE (NRF_GAP_ERR_BASE + 0x004) /**< Attempt to modify the device identity list while already in use by another operation. */ -#define BLE_ERROR_GAP_DEVICE_IDENTITIES_DUPLICATE (NRF_GAP_ERR_BASE + 0x005) /**< The device identity list contains entries with duplicate identity addresses. */ -/**@} */ - - -/**@defgroup BLE_GAP_ROLES GAP Roles - * @note Not explicitly used in peripheral API, but will be relevant for central API. - * @{ */ -#define BLE_GAP_ROLE_INVALID 0x0 /**< Invalid Role. */ -#define BLE_GAP_ROLE_PERIPH 0x1 /**< Peripheral Role. */ -#define BLE_GAP_ROLE_CENTRAL 0x2 /**< Central Role. */ -/**@} */ - - -/**@defgroup BLE_GAP_TIMEOUT_SOURCES GAP Timeout sources - * @{ */ -#define BLE_GAP_TIMEOUT_SRC_ADVERTISING 0x00 /**< Advertising timeout. */ -#define BLE_GAP_TIMEOUT_SRC_SCAN 0x01 /**< Scanning timeout. */ -#define BLE_GAP_TIMEOUT_SRC_CONN 0x02 /**< Connection timeout. */ -#define BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD 0x03 /**< Authenticated payload timeout. */ -/**@} */ - - -/**@defgroup BLE_GAP_ADDR_TYPES GAP Address types - * @{ */ -#define BLE_GAP_ADDR_TYPE_PUBLIC 0x00 /**< Public address. */ -#define BLE_GAP_ADDR_TYPE_RANDOM_STATIC 0x01 /**< Random static address. */ -#define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE 0x02 /**< Random private resolvable address. */ -#define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE 0x03 /**< Random private non-resolvable address. */ -/**@} */ - - -/**@brief The default interval in seconds at which a private address is refreshed. */ -#define BLE_GAP_DEFAULT_PRIVATE_ADDR_CYCLE_INTERVAL_S (900) /* 15 minutes. */ -/**@brief The maximum interval in seconds at which a private address can be refreshed. */ -#define BLE_GAP_MAX_PRIVATE_ADDR_CYCLE_INTERVAL_S (41400) /* 11 hours 30 minutes. */ - - -/** @brief BLE address length. */ -#define BLE_GAP_ADDR_LEN (6) - - -/**@defgroup BLE_GAP_PRIVACY_MODES Privacy modes - * @{ */ -#define BLE_GAP_PRIVACY_MODE_OFF 0x00 /**< Device will send and accept its identity address for its own address. */ -#define BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY 0x01 /**< Device will send and accept only private addresses for its own address. */ -#define BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY 0x02 /**< Device will send and accept only private addresses for its own address, - and will not accept a peer using identity address as sender address when - the peer IRK is exchanged, non-zero and added to the identity list. */ -/**@} */ - - -/**@defgroup BLE_GAP_AD_TYPE_DEFINITIONS GAP Advertising and Scan Response Data format - * @note Found at https://www.bluetooth.org/Technical/AssignedNumbers/generic_access_profile.htm - * @{ */ -#define BLE_GAP_AD_TYPE_FLAGS 0x01 /**< Flags for discoverability. */ -#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE 0x02 /**< Partial list of 16 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE 0x03 /**< Complete list of 16 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE 0x04 /**< Partial list of 32 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_COMPLETE 0x05 /**< Complete list of 32 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE 0x06 /**< Partial list of 128 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE 0x07 /**< Complete list of 128 bit service UUIDs. */ -#define BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME 0x08 /**< Short local device name. */ -#define BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME 0x09 /**< Complete local device name. */ -#define BLE_GAP_AD_TYPE_TX_POWER_LEVEL 0x0A /**< Transmit power level. */ -#define BLE_GAP_AD_TYPE_CLASS_OF_DEVICE 0x0D /**< Class of device. */ -#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C 0x0E /**< Simple Pairing Hash C. */ -#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R 0x0F /**< Simple Pairing Randomizer R. */ -#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_TK_VALUE 0x10 /**< Security Manager TK Value. */ -#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_OOB_FLAGS 0x11 /**< Security Manager Out Of Band Flags. */ -#define BLE_GAP_AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE 0x12 /**< Slave Connection Interval Range. */ -#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT 0x14 /**< List of 16-bit Service Solicitation UUIDs. */ -#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT 0x15 /**< List of 128-bit Service Solicitation UUIDs. */ -#define BLE_GAP_AD_TYPE_SERVICE_DATA 0x16 /**< Service Data - 16-bit UUID. */ -#define BLE_GAP_AD_TYPE_PUBLIC_TARGET_ADDRESS 0x17 /**< Public Target Address. */ -#define BLE_GAP_AD_TYPE_RANDOM_TARGET_ADDRESS 0x18 /**< Random Target Address. */ -#define BLE_GAP_AD_TYPE_APPEARANCE 0x19 /**< Appearance. */ -#define BLE_GAP_AD_TYPE_ADVERTISING_INTERVAL 0x1A /**< Advertising Interval. */ -#define BLE_GAP_AD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS 0x1B /**< LE Bluetooth Device Address. */ -#define BLE_GAP_AD_TYPE_LE_ROLE 0x1C /**< LE Role. */ -#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C256 0x1D /**< Simple Pairing Hash C-256. */ -#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R256 0x1E /**< Simple Pairing Randomizer R-256. */ -#define BLE_GAP_AD_TYPE_SERVICE_DATA_32BIT_UUID 0x20 /**< Service Data - 32-bit UUID. */ -#define BLE_GAP_AD_TYPE_SERVICE_DATA_128BIT_UUID 0x21 /**< Service Data - 128-bit UUID. */ -#define BLE_GAP_AD_TYPE_LESC_CONFIRMATION_VALUE 0x22 /**< LE Secure Connections Confirmation Value */ -#define BLE_GAP_AD_TYPE_LESC_RANDOM_VALUE 0x23 /**< LE Secure Connections Random Value */ -#define BLE_GAP_AD_TYPE_URI 0x24 /**< URI */ -#define BLE_GAP_AD_TYPE_3D_INFORMATION_DATA 0x3D /**< 3D Information Data. */ -#define BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA 0xFF /**< Manufacturer Specific Data. */ -/**@} */ - - -/**@defgroup BLE_GAP_ADV_FLAGS GAP Advertisement Flags - * @{ */ -#define BLE_GAP_ADV_FLAG_LE_LIMITED_DISC_MODE (0x01) /**< LE Limited Discoverable Mode. */ -#define BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE (0x02) /**< LE General Discoverable Mode. */ -#define BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED (0x04) /**< BR/EDR not supported. */ -#define BLE_GAP_ADV_FLAG_LE_BR_EDR_CONTROLLER (0x08) /**< Simultaneous LE and BR/EDR, Controller. */ -#define BLE_GAP_ADV_FLAG_LE_BR_EDR_HOST (0x10) /**< Simultaneous LE and BR/EDR, Host. */ -#define BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE (BLE_GAP_ADV_FLAG_LE_LIMITED_DISC_MODE | BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED) /**< LE Limited Discoverable Mode, BR/EDR not supported. */ -#define BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE (BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE | BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED) /**< LE General Discoverable Mode, BR/EDR not supported. */ -/**@} */ - - -/**@defgroup BLE_GAP_ADV_INTERVALS GAP Advertising interval max and min - * @{ */ -#define BLE_GAP_ADV_INTERVAL_MIN 0x0020 /**< Minimum Advertising interval in 625 us units, i.e. 20 ms. */ -#define BLE_GAP_ADV_INTERVAL_MAX 0x4000 /**< Maximum Advertising interval in 625 us units, i.e. 10.24 s. */ - /**@} */ - - -/**@defgroup BLE_GAP_SCAN_INTERVALS GAP Scan interval max and min - * @{ */ -#define BLE_GAP_SCAN_INTERVAL_MIN 0x0004 /**< Minimum Scan interval in 625 us units, i.e. 2.5 ms. */ -#define BLE_GAP_SCAN_INTERVAL_MAX 0x4000 /**< Maximum Scan interval in 625 us units, i.e. 10.24 s. */ - /** @} */ - - -/**@defgroup BLE_GAP_SCAN_WINDOW GAP Scan window max and min - * @{ */ -#define BLE_GAP_SCAN_WINDOW_MIN 0x0004 /**< Minimum Scan window in 625 us units, i.e. 2.5 ms. */ -#define BLE_GAP_SCAN_WINDOW_MAX 0x4000 /**< Maximum Scan window in 625 us units, i.e. 10.24 s. */ - /** @} */ - - -/**@defgroup BLE_GAP_SCAN_TIMEOUT GAP Scan timeout max and min - * @{ */ -#define BLE_GAP_SCAN_TIMEOUT_MIN 0x0001 /**< Minimum Scan timeout in seconds. */ -#define BLE_GAP_SCAN_TIMEOUT_MAX 0xFFFF /**< Maximum Scan timeout in seconds. */ - /** @} */ - - -/**@brief Maximum size of advertising data in octets. */ -#define BLE_GAP_ADV_MAX_SIZE (31) - - -/**@defgroup BLE_GAP_ADV_TYPES GAP Advertising types - * @{ */ -#define BLE_GAP_ADV_TYPE_ADV_IND 0x00 /**< Connectable undirected. */ -#define BLE_GAP_ADV_TYPE_ADV_DIRECT_IND 0x01 /**< Connectable directed. */ -#define BLE_GAP_ADV_TYPE_ADV_SCAN_IND 0x02 /**< Scannable undirected. */ -#define BLE_GAP_ADV_TYPE_ADV_NONCONN_IND 0x03 /**< Non connectable undirected. */ -/**@} */ - - -/**@defgroup BLE_GAP_ADV_FILTER_POLICIES GAP Advertising filter policies - * @{ */ -#define BLE_GAP_ADV_FP_ANY 0x00 /**< Allow scan requests and connect requests from any device. */ -#define BLE_GAP_ADV_FP_FILTER_SCANREQ 0x01 /**< Filter scan requests with whitelist. */ -#define BLE_GAP_ADV_FP_FILTER_CONNREQ 0x02 /**< Filter connect requests with whitelist. */ -#define BLE_GAP_ADV_FP_FILTER_BOTH 0x03 /**< Filter both scan and connect requests with whitelist. */ -/**@} */ - - -/**@defgroup BLE_GAP_ADV_TIMEOUT_VALUES GAP Advertising timeout values - * @{ */ -#define BLE_GAP_ADV_TIMEOUT_LIMITED_MAX (180) /**< Maximum advertising time in limited discoverable mode (TGAP(lim_adv_timeout) = 180 s). */ -#define BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED (0) /**< Unlimited advertising in general discoverable mode. */ -/**@} */ - - -/**@defgroup BLE_GAP_DISC_MODES GAP Discovery modes - * @{ */ -#define BLE_GAP_DISC_MODE_NOT_DISCOVERABLE 0x00 /**< Not discoverable discovery Mode. */ -#define BLE_GAP_DISC_MODE_LIMITED 0x01 /**< Limited Discovery Mode. */ -#define BLE_GAP_DISC_MODE_GENERAL 0x02 /**< General Discovery Mode. */ -/**@} */ - - -/**@defgroup BLE_GAP_IO_CAPS GAP IO Capabilities - * @{ */ -#define BLE_GAP_IO_CAPS_DISPLAY_ONLY 0x00 /**< Display Only. */ -#define BLE_GAP_IO_CAPS_DISPLAY_YESNO 0x01 /**< Display and Yes/No entry. */ -#define BLE_GAP_IO_CAPS_KEYBOARD_ONLY 0x02 /**< Keyboard Only. */ -#define BLE_GAP_IO_CAPS_NONE 0x03 /**< No I/O capabilities. */ -#define BLE_GAP_IO_CAPS_KEYBOARD_DISPLAY 0x04 /**< Keyboard and Display. */ -/**@} */ - - -/**@defgroup BLE_GAP_AUTH_KEY_TYPES GAP Authentication Key Types - * @{ */ -#define BLE_GAP_AUTH_KEY_TYPE_NONE 0x00 /**< No key (may be used to reject). */ -#define BLE_GAP_AUTH_KEY_TYPE_PASSKEY 0x01 /**< 6-digit Passkey. */ -#define BLE_GAP_AUTH_KEY_TYPE_OOB 0x02 /**< Out Of Band data. */ -/**@} */ - - -/**@defgroup BLE_GAP_KP_NOT_TYPES GAP Keypress Notification Types - * @{ */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_START 0x00 /**< Passkey entry started. */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_DIGIT_IN 0x01 /**< Passkey digit entered. */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_DIGIT_OUT 0x02 /**< Passkey digit erased. */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_CLEAR 0x03 /**< Passkey cleared. */ -#define BLE_GAP_KP_NOT_TYPE_PASSKEY_END 0x04 /**< Passkey entry completed. */ -/**@} */ - - -/**@defgroup BLE_GAP_SEC_STATUS GAP Security status - * @{ */ -#define BLE_GAP_SEC_STATUS_SUCCESS 0x00 /**< Procedure completed with success. */ -#define BLE_GAP_SEC_STATUS_TIMEOUT 0x01 /**< Procedure timed out. */ -#define BLE_GAP_SEC_STATUS_PDU_INVALID 0x02 /**< Invalid PDU received. */ -#define BLE_GAP_SEC_STATUS_RFU_RANGE1_BEGIN 0x03 /**< Reserved for Future Use range #1 begin. */ -#define BLE_GAP_SEC_STATUS_RFU_RANGE1_END 0x80 /**< Reserved for Future Use range #1 end. */ -#define BLE_GAP_SEC_STATUS_PASSKEY_ENTRY_FAILED 0x81 /**< Passkey entry failed (user canceled or other). */ -#define BLE_GAP_SEC_STATUS_OOB_NOT_AVAILABLE 0x82 /**< Out of Band Key not available. */ -#define BLE_GAP_SEC_STATUS_AUTH_REQ 0x83 /**< Authentication requirements not met. */ -#define BLE_GAP_SEC_STATUS_CONFIRM_VALUE 0x84 /**< Confirm value failed. */ -#define BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP 0x85 /**< Pairing not supported. */ -#define BLE_GAP_SEC_STATUS_ENC_KEY_SIZE 0x86 /**< Encryption key size. */ -#define BLE_GAP_SEC_STATUS_SMP_CMD_UNSUPPORTED 0x87 /**< Unsupported SMP command. */ -#define BLE_GAP_SEC_STATUS_UNSPECIFIED 0x88 /**< Unspecified reason. */ -#define BLE_GAP_SEC_STATUS_REPEATED_ATTEMPTS 0x89 /**< Too little time elapsed since last attempt. */ -#define BLE_GAP_SEC_STATUS_INVALID_PARAMS 0x8A /**< Invalid parameters. */ -#define BLE_GAP_SEC_STATUS_DHKEY_FAILURE 0x8B /**< DHKey check failure. */ -#define BLE_GAP_SEC_STATUS_NUM_COMP_FAILURE 0x8C /**< Numeric Comparison failure. */ -#define BLE_GAP_SEC_STATUS_BR_EDR_IN_PROG 0x8D /**< BR/EDR pairing in progress. */ -#define BLE_GAP_SEC_STATUS_X_TRANS_KEY_DISALLOWED 0x8E /**< BR/EDR Link Key cannot be used for LE keys. */ -#define BLE_GAP_SEC_STATUS_RFU_RANGE2_BEGIN 0x8F /**< Reserved for Future Use range #2 begin. */ -#define BLE_GAP_SEC_STATUS_RFU_RANGE2_END 0xFF /**< Reserved for Future Use range #2 end. */ -/**@} */ - - -/**@defgroup BLE_GAP_SEC_STATUS_SOURCES GAP Security status sources - * @{ */ -#define BLE_GAP_SEC_STATUS_SOURCE_LOCAL 0x00 /**< Local failure. */ -#define BLE_GAP_SEC_STATUS_SOURCE_REMOTE 0x01 /**< Remote failure. */ -/**@} */ - - -/**@defgroup BLE_GAP_CP_LIMITS GAP Connection Parameters Limits - * @{ */ -#define BLE_GAP_CP_MIN_CONN_INTVL_NONE 0xFFFF /**< No new minimum connection interval specified in connect parameters. */ -#define BLE_GAP_CP_MIN_CONN_INTVL_MIN 0x0006 /**< Lowest minimum connection interval permitted, in units of 1.25 ms, i.e. 7.5 ms. */ -#define BLE_GAP_CP_MIN_CONN_INTVL_MAX 0x0C80 /**< Highest minimum connection interval permitted, in units of 1.25 ms, i.e. 4 s. */ -#define BLE_GAP_CP_MAX_CONN_INTVL_NONE 0xFFFF /**< No new maximum connection interval specified in connect parameters. */ -#define BLE_GAP_CP_MAX_CONN_INTVL_MIN 0x0006 /**< Lowest maximum connection interval permitted, in units of 1.25 ms, i.e. 7.5 ms. */ -#define BLE_GAP_CP_MAX_CONN_INTVL_MAX 0x0C80 /**< Highest maximum connection interval permitted, in units of 1.25 ms, i.e. 4 s. */ -#define BLE_GAP_CP_SLAVE_LATENCY_MAX 0x01F3 /**< Highest slave latency permitted, in connection events. */ -#define BLE_GAP_CP_CONN_SUP_TIMEOUT_NONE 0xFFFF /**< No new supervision timeout specified in connect parameters. */ -#define BLE_GAP_CP_CONN_SUP_TIMEOUT_MIN 0x000A /**< Lowest supervision timeout permitted, in units of 10 ms, i.e. 100 ms. */ -#define BLE_GAP_CP_CONN_SUP_TIMEOUT_MAX 0x0C80 /**< Highest supervision timeout permitted, in units of 10 ms, i.e. 32 s. */ -/**@} */ - - -/**@defgroup BLE_GAP_DEVNAME GAP device name defines. - * @{ */ -#define BLE_GAP_DEVNAME_DEFAULT "nRF5x" /**< Default device name value. */ -#define BLE_GAP_DEVNAME_DEFAULT_LEN 31 /**< Default number of octets in device name. */ -#define BLE_GAP_DEVNAME_MAX_LEN 248 /**< Maximum number of octets in device name. */ -/**@} */ - - -/**@brief Disable RSSI events for connections */ -#define BLE_GAP_RSSI_THRESHOLD_INVALID 0xFF - -/**@defgroup BLE_GAP_PHYS GAP PHYs - * @{ */ -#define BLE_GAP_PHY_AUTO 0x00 /**< Automatic PHY selection. Refer @ref sd_ble_gap_phy_update for more information.*/ -#define BLE_GAP_PHY_1MBPS 0x01 /**< 1 Mbps PHY. */ -#define BLE_GAP_PHY_2MBPS 0x02 /**< 2 Mbps PHY. */ -#define BLE_GAP_PHY_CODED 0x04 /**< Coded PHY. */ - -/**@} */ - -/**@defgroup BLE_GAP_CONN_SEC_MODE_SET_MACROS GAP attribute security requirement setters - * - * See @ref ble_gap_conn_sec_mode_t. - * @{ */ -/**@brief Set sec_mode pointed to by ptr to have no access rights.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(ptr) do {(ptr)->sm = 0; (ptr)->lv = 0;} while(0) -/**@brief Set sec_mode pointed to by ptr to require no protection, open link.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_OPEN(ptr) do {(ptr)->sm = 1; (ptr)->lv = 1;} while(0) -/**@brief Set sec_mode pointed to by ptr to require encryption, but no MITM protection.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 2;} while(0) -/**@brief Set sec_mode pointed to by ptr to require encryption and MITM protection.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_ENC_WITH_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 3;} while(0) -/**@brief Set sec_mode pointed to by ptr to require LESC encryption and MITM protection.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_LESC_ENC_WITH_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 4;} while(0) -/**@brief Set sec_mode pointed to by ptr to require signing or encryption, no MITM protection needed.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_NO_MITM(ptr) do {(ptr)->sm = 2; (ptr)->lv = 1;} while(0) -/**@brief Set sec_mode pointed to by ptr to require signing or encryption with MITM protection.*/ -#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_WITH_MITM(ptr) do {(ptr)->sm = 2; (ptr)->lv = 2;} while(0) -/**@} */ - - -/**@brief GAP Security Random Number Length. */ -#define BLE_GAP_SEC_RAND_LEN 8 - - -/**@brief GAP Security Key Length. */ -#define BLE_GAP_SEC_KEY_LEN 16 - - -/**@brief GAP LE Secure Connections Elliptic Curve Diffie-Hellman P-256 Public Key Length. */ -#define BLE_GAP_LESC_P256_PK_LEN 64 - - -/**@brief GAP LE Secure Connections Elliptic Curve Diffie-Hellman DHKey Length. */ -#define BLE_GAP_LESC_DHKEY_LEN 32 - - -/**@brief GAP Passkey Length. */ -#define BLE_GAP_PASSKEY_LEN 6 - - -/**@brief Maximum amount of addresses in the whitelist. */ -#define BLE_GAP_WHITELIST_ADDR_MAX_COUNT (8) - - -/**@brief Maximum amount of identities in the device identities list. */ -#define BLE_GAP_DEVICE_IDENTITIES_MAX_COUNT (8) - - -/**@brief Default connection count for a configuration. */ -#define BLE_GAP_CONN_COUNT_DEFAULT (1) - - -/**@defgroup BLE_GAP_EVENT_LENGTH GAP event length defines. - * @{ */ -#define BLE_GAP_EVENT_LENGTH_MIN (2) /**< Minimum event length, in 1.25 ms units. */ -#define BLE_GAP_EVENT_LENGTH_DEFAULT (3) /**< Default event length, in 1.25 ms units. */ -/**@} */ - - -/**@defgroup BLE_GAP_ROLE_COUNT GAP concurrent connection count defines. - * @{ */ -#define BLE_GAP_ROLE_COUNT_PERIPH_DEFAULT (1) /**< Default maximum number of connections concurrently acting as peripherals. */ -#define BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT (3) /**< Default maximum number of connections concurrently acting as centrals. */ -#define BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT (1) /**< Default number of SMP instances shared between all connections acting as centrals. */ -#define BLE_GAP_ROLE_COUNT_COMBINED_MAX (20) /**< Maximum supported number of concurrent connections in the peripheral and central roles combined. */ -/**@} */ - - -/**@brief Automatic data length parameter. */ -#define BLE_GAP_DATA_LENGTH_AUTO 0 - -/**@defgroup BLE_GAP_AUTH_PAYLOAD_TIMEOUT Authenticated payload timeout defines. - * @{ */ -#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX (48000) /**< Maximum authenticated payload timeout in 10 ms units, i.e. 8 minutes. */ -#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MIN (1) /**< Minimum authenticated payload timeout in 10 ms units, i.e. 10 ms. */ -/**@} */ - -/**@defgroup GAP_SEC_MODES GAP Security Modes - * @{ */ -#define BLE_GAP_SEC_MODE 0x00 /**< No key (may be used to reject). */ -/**@} */ -/** @} */ - - -/**@addtogroup BLE_GAP_STRUCTURES Structures - * @{ */ - -/**@brief Bluetooth Low Energy address. */ -typedef struct -{ - uint8_t addr_id_peer : 1; /**< Only valid for peer addresses. - Reference to peer in device identities list (as set with @ref sd_ble_gap_device_identities_set) when peer is using privacy. */ - uint8_t addr_type : 7; /**< See @ref BLE_GAP_ADDR_TYPES. */ - uint8_t addr[BLE_GAP_ADDR_LEN]; /**< 48-bit address, LSB format. */ -} ble_gap_addr_t; - - -/**@brief GAP connection parameters. - * - * @note When ble_conn_params_t is received in an event, both min_conn_interval and - * max_conn_interval will be equal to the connection interval set by the central. - * - * @note If both conn_sup_timeout and max_conn_interval are specified, then the following constraint applies: - * conn_sup_timeout * 4 > (1 + slave_latency) * max_conn_interval - * that corresponds to the following Bluetooth Spec requirement: - * The Supervision_Timeout in milliseconds shall be larger than - * (1 + Conn_Latency) * Conn_Interval_Max * 2, where Conn_Interval_Max is given in milliseconds. - */ -typedef struct -{ - uint16_t min_conn_interval; /**< Minimum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/ - uint16_t max_conn_interval; /**< Maximum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/ - uint16_t slave_latency; /**< Slave Latency in number of connection events, see @ref BLE_GAP_CP_LIMITS.*/ - uint16_t conn_sup_timeout; /**< Connection Supervision Timeout in 10 ms units, see @ref BLE_GAP_CP_LIMITS.*/ -} ble_gap_conn_params_t; - - -/**@brief GAP connection security modes. - * - * Security Mode 0 Level 0: No access permissions at all (this level is not defined by the Bluetooth Core specification).\n - * Security Mode 1 Level 1: No security is needed (aka open link).\n - * Security Mode 1 Level 2: Encrypted link required, MITM protection not necessary.\n - * Security Mode 1 Level 3: MITM protected encrypted link required.\n - * Security Mode 1 Level 4: LESC MITM protected encrypted link using a 128-bit strength encryption key required.\n - * Security Mode 2 Level 1: Signing or encryption required, MITM protection not necessary.\n - * Security Mode 2 Level 2: MITM protected signing required, unless link is MITM protected encrypted.\n - */ -typedef struct -{ - uint8_t sm : 4; /**< Security Mode (1 or 2), 0 for no permissions at all. */ - uint8_t lv : 4; /**< Level (1, 2, 3 or 4), 0 for no permissions at all. */ - -} ble_gap_conn_sec_mode_t; - - -/**@brief GAP connection security status.*/ -typedef struct -{ - ble_gap_conn_sec_mode_t sec_mode; /**< Currently active security mode for this connection.*/ - uint8_t encr_key_size; /**< Length of currently active encryption key, 7 to 16 octets (only applicable for bonding procedures). */ -} ble_gap_conn_sec_t; - -/**@brief Identity Resolving Key. */ -typedef struct -{ - uint8_t irk[BLE_GAP_SEC_KEY_LEN]; /**< Array containing IRK. */ -} ble_gap_irk_t; - - -/**@brief Channel mask for RF channels used in advertising. */ -typedef struct -{ - uint8_t ch_37_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 37 */ - uint8_t ch_38_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 38 */ - uint8_t ch_39_off : 1; /**< Setting this bit to 1 will turn off advertising on channel 39 */ -} ble_gap_adv_ch_mask_t; - - -/**@brief GAP advertising parameters. */ -typedef struct -{ - uint8_t type; /**< See @ref BLE_GAP_ADV_TYPES. */ - ble_gap_addr_t const *p_peer_addr; /**< Address of a known peer. - - When privacy is enabled and the local device use @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE addresses, the device identity list is searched for a matching - entry. If the local IRK for that device identity is set, the local IRK for that device will be used to generate the advertiser address field in the advertise packet. - - If type is @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this must be set to the targeted initiator. If the initiator is in the device identity list, - the peer IRK for that device will be used to generate the initiator address field in the ADV_DIRECT_IND packet. */ - uint8_t fp; /**< Filter Policy, see @ref BLE_GAP_ADV_FILTER_POLICIES. */ - uint16_t interval; /**< Advertising interval between 0x0020 and 0x4000 in 0.625 ms units (20 ms to 10.24 s), see @ref BLE_GAP_ADV_INTERVALS. - - If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this parameter must be set to 0 for high duty cycle directed advertising. - - If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, set @ref BLE_GAP_ADV_INTERVAL_MIN <= interval <= @ref BLE_GAP_ADV_INTERVAL_MAX for low duty cycle advertising.*/ - uint16_t timeout; /**< Advertising timeout between 0x0001 and 0x3FFF in seconds, 0x0000 disables timeout. See also @ref BLE_GAP_ADV_TIMEOUT_VALUES. If type equals @ref BLE_GAP_ADV_TYPE_ADV_DIRECT_IND, this parameter must be set to 0 for High duty cycle directed advertising. */ - ble_gap_adv_ch_mask_t channel_mask; /**< Advertising channel mask. See @ref ble_gap_adv_ch_mask_t. */ -} ble_gap_adv_params_t; - - -/**@brief GAP scanning parameters. */ -typedef struct -{ - uint8_t active : 1; /**< If 1, perform active scanning (scan requests). */ - uint8_t use_whitelist : 1; /**< If 1, filter advertisers using current active whitelist. */ - uint8_t adv_dir_report : 1; /**< If 1, also report directed advertisements where the initiator field is set to a private resolvable address, - even if the address did not resolve to an entry in the device identity list. A report will be generated - even if the peer is not in the whitelist. */ - uint16_t interval; /**< Scan interval between 0x0004 and 0x4000 in 0.625 ms units (2.5 ms to 10.24 s). */ - uint16_t window; /**< Scan window between 0x0004 and 0x4000 in 0.625 ms units (2.5 ms to 10.24 s). */ - uint16_t timeout; /**< Scan timeout between 0x0001 and 0xFFFF in seconds, 0x0000 disables timeout. */ -} ble_gap_scan_params_t; - - -/**@brief Privacy. - * - * The privacy feature provides a way for the device to avoid being tracked over a period of time. - * The privacy feature, when enabled, hides the local device identity and replaces it with a private address - * that is automatically refreshed at a specified interval. - * - * If a device still wants to be recognized by other peers, it needs to share it's Identity Resolving Key (IRK). - * With this key, a device can generate a random private address that can only be recognized by peers in possession of that key, - * and devices can establish connections without revealing their real identities. - * - * Both network privacy (@ref BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY) and device privacy (@ref BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY) - * are supported. - * - * @note If the device IRK is updated, the new IRK becomes the one to be distributed in all - * bonding procedures performed after @ref sd_ble_gap_privacy_set returns. - * The IRK distributed during bonding procedure is the device IRK that is active when @ref sd_ble_gap_sec_params_reply is called. - */ -typedef struct -{ - uint8_t privacy_mode; /**< Privacy mode, see @ref BLE_GAP_PRIVACY_MODES. Default is @ref BLE_GAP_PRIVACY_MODE_OFF. */ - uint8_t private_addr_type; /**< The private address type must be either @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE or @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE. */ - uint16_t private_addr_cycle_s; /**< Private address cycle interval in seconds. Providing an address cycle value of 0 will use the default value defined by @ref BLE_GAP_DEFAULT_PRIVATE_ADDR_CYCLE_INTERVAL_S. */ - ble_gap_irk_t *p_device_irk; /**< When used as input, pointer to IRK structure that will be used as the default IRK. If NULL, the device default IRK will be used. - When used as output, pointer to IRK structure where the current default IRK will be written to. If NULL, this argument is ignored. - By default, the default IRK is used to generate random private resolvable addresses for the local device unless instructed otherwise. */ -} ble_gap_privacy_params_t; - - -/**@brief PHY preferences for TX and RX - * @note tx_phys and rx_phys are bit fields. Multiple bits can be set in them to indicate multiple preferred PHYs for each direction. - * @code - * p_gap_phys->tx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; - * p_gap_phys->rx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS; - * @endcode - * - */ -typedef struct -{ - uint8_t tx_phys; /**< Preferred transmit PHYs, see @ref BLE_GAP_PHYS. */ - uint8_t rx_phys; /**< Preferred receive PHYs, see @ref BLE_GAP_PHYS. */ -} ble_gap_phys_t; - -/** @brief Keys that can be exchanged during a bonding procedure. */ -typedef struct -{ - uint8_t enc : 1; /**< Long Term Key and Master Identification. */ - uint8_t id : 1; /**< Identity Resolving Key and Identity Address Information. */ - uint8_t sign : 1; /**< Connection Signature Resolving Key. */ - uint8_t link : 1; /**< Derive the Link Key from the LTK. */ -} ble_gap_sec_kdist_t; - - -/**@brief GAP security parameters. */ -typedef struct -{ - uint8_t bond : 1; /**< Perform bonding. */ - uint8_t mitm : 1; /**< Enable Man In The Middle protection. */ - uint8_t lesc : 1; /**< Enable LE Secure Connection pairing. */ - uint8_t keypress : 1; /**< Enable generation of keypress notifications. */ - uint8_t io_caps : 3; /**< IO capabilities, see @ref BLE_GAP_IO_CAPS. */ - uint8_t oob : 1; /**< The OOB data flag. - - In LE legacy pairing, this flag is set if a device has out of band authentication data. - The OOB method is used if both of the devices have out of band authentication data. - - In LE Secure Connections pairing, this flag is set if a device has the peer device's out of band authentication data. - The OOB method is used if at least one device has the peer device's OOB data available. */ - uint8_t min_key_size; /**< Minimum encryption key size in octets between 7 and 16. If 0 then not applicable in this instance. */ - uint8_t max_key_size; /**< Maximum encryption key size in octets between min_key_size and 16. */ - ble_gap_sec_kdist_t kdist_own; /**< Key distribution bitmap: keys that the local device will distribute. */ - ble_gap_sec_kdist_t kdist_peer; /**< Key distribution bitmap: keys that the remote device will distribute. */ -} ble_gap_sec_params_t; - - -/**@brief GAP Encryption Information. */ -typedef struct -{ - uint8_t ltk[BLE_GAP_SEC_KEY_LEN]; /**< Long Term Key. */ - uint8_t lesc : 1; /**< Key generated using LE Secure Connections. */ - uint8_t auth : 1; /**< Authenticated Key. */ - uint8_t ltk_len : 6; /**< LTK length in octets. */ -} ble_gap_enc_info_t; - - -/**@brief GAP Master Identification. */ -typedef struct -{ - uint16_t ediv; /**< Encrypted Diversifier. */ - uint8_t rand[BLE_GAP_SEC_RAND_LEN]; /**< Random Number. */ -} ble_gap_master_id_t; - - -/**@brief GAP Signing Information. */ -typedef struct -{ - uint8_t csrk[BLE_GAP_SEC_KEY_LEN]; /**< Connection Signature Resolving Key. */ -} ble_gap_sign_info_t; - - -/**@brief GAP LE Secure Connections P-256 Public Key. */ -typedef struct -{ - uint8_t pk[BLE_GAP_LESC_P256_PK_LEN]; /**< LE Secure Connections Elliptic Curve Diffie-Hellman P-256 Public Key. Stored in the standard SMP protocol format: {X,Y} both in little-endian. */ -} ble_gap_lesc_p256_pk_t; - - -/**@brief GAP LE Secure Connections DHKey. */ -typedef struct -{ - uint8_t key[BLE_GAP_LESC_DHKEY_LEN]; /**< LE Secure Connections Elliptic Curve Diffie-Hellman Key. Stored in little-endian. */ -} ble_gap_lesc_dhkey_t; - - -/**@brief GAP LE Secure Connections OOB data. */ -typedef struct -{ - ble_gap_addr_t addr; /**< Bluetooth address of the device. */ - uint8_t r[BLE_GAP_SEC_KEY_LEN]; /**< Random Number. */ - uint8_t c[BLE_GAP_SEC_KEY_LEN]; /**< Confirm Value. */ -} ble_gap_lesc_oob_data_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_CONNECTED. */ -typedef struct -{ - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 - and the address is the device's identity address. */ - uint8_t role; /**< BLE role for this connection, see @ref BLE_GAP_ROLES */ - ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ -} ble_gap_evt_connected_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_DISCONNECTED. */ -typedef struct -{ - uint8_t reason; /**< HCI error code, see @ref BLE_HCI_STATUS_CODES. */ -} ble_gap_evt_disconnected_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_CONN_PARAM_UPDATE. */ -typedef struct -{ - ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ -} ble_gap_evt_conn_param_update_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_PHY_UPDATE_REQUEST. */ -typedef struct -{ - ble_gap_phys_t peer_preferred_phys; /**< The PHYs the peer prefers to use. */ -} ble_gap_evt_phy_update_request_t; - -/**@brief Event Structure for @ref BLE_GAP_EVT_PHY_UPDATE. */ -typedef struct -{ - uint8_t status; /**< Status of the procedure, see @ref BLE_HCI_STATUS_CODES.*/ - uint8_t tx_phy; /**< TX PHY for this connection, see @ref BLE_GAP_PHYS. */ - uint8_t rx_phy; /**< RX PHY for this connection, see @ref BLE_GAP_PHYS. */ -} ble_gap_evt_phy_update_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST. */ -typedef struct -{ - ble_gap_sec_params_t peer_params; /**< Initiator Security Parameters. */ -} ble_gap_evt_sec_params_request_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_SEC_INFO_REQUEST. */ -typedef struct -{ - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. */ - ble_gap_master_id_t master_id; /**< Master Identification for LTK lookup. */ - uint8_t enc_info : 1; /**< If 1, Encryption Information required. */ - uint8_t id_info : 1; /**< If 1, Identity Information required. */ - uint8_t sign_info : 1; /**< If 1, Signing Information required. */ -} ble_gap_evt_sec_info_request_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_PASSKEY_DISPLAY. */ -typedef struct -{ - uint8_t passkey[BLE_GAP_PASSKEY_LEN]; /**< 6-digit passkey in ASCII ('0'-'9' digits only). */ - uint8_t match_request : 1; /**< If 1 requires the application to report the match using @ref sd_ble_gap_auth_key_reply - with either @ref BLE_GAP_AUTH_KEY_TYPE_NONE if there is no match or - @ref BLE_GAP_AUTH_KEY_TYPE_PASSKEY if there is a match. */ -} ble_gap_evt_passkey_display_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_KEY_PRESSED. */ -typedef struct -{ - uint8_t kp_not; /**< Keypress notification type, see @ref BLE_GAP_KP_NOT_TYPES. */ -} ble_gap_evt_key_pressed_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_AUTH_KEY_REQUEST. */ -typedef struct -{ - uint8_t key_type; /**< See @ref BLE_GAP_AUTH_KEY_TYPES. */ -} ble_gap_evt_auth_key_request_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST. */ -typedef struct -{ - ble_gap_lesc_p256_pk_t *p_pk_peer; /**< LE Secure Connections remote P-256 Public Key. This will point to the application-supplied memory - inside the keyset during the call to @ref sd_ble_gap_sec_params_reply. */ - uint8_t oobd_req :1; /**< LESC OOB data required. A call to @ref sd_ble_gap_lesc_oob_data_set is required to complete the procedure. */ -} ble_gap_evt_lesc_dhkey_request_t; - - -/**@brief Security levels supported. - * @note See Bluetooth Specification Version 4.2 Volume 3, Part C, Chapter 10, Section 10.2.1. -*/ -typedef struct -{ - uint8_t lv1 : 1; /**< If 1: Level 1 is supported. */ - uint8_t lv2 : 1; /**< If 1: Level 2 is supported. */ - uint8_t lv3 : 1; /**< If 1: Level 3 is supported. */ - uint8_t lv4 : 1; /**< If 1: Level 4 is supported. */ -} ble_gap_sec_levels_t; - - -/**@brief Encryption Key. */ -typedef struct -{ - ble_gap_enc_info_t enc_info; /**< Encryption Information. */ - ble_gap_master_id_t master_id; /**< Master Identification. */ -} ble_gap_enc_key_t; - - -/**@brief Identity Key. */ -typedef struct -{ - ble_gap_irk_t id_info; /**< Identity Resolving Key. */ - ble_gap_addr_t id_addr_info; /**< Identity Address. */ -} ble_gap_id_key_t; - - -/**@brief Security Keys. */ -typedef struct -{ - ble_gap_enc_key_t *p_enc_key; /**< Encryption Key, or NULL. */ - ble_gap_id_key_t *p_id_key; /**< Identity Key, or NULL. */ - ble_gap_sign_info_t *p_sign_key; /**< Signing Key, or NULL. */ - ble_gap_lesc_p256_pk_t *p_pk; /**< LE Secure Connections P-256 Public Key. When in debug mode the application must use the value defined - in the Core Bluetooth Specification v4.2 Vol.3, Part H, Section 2.3.5.6.1 */ -} ble_gap_sec_keys_t; - - -/**@brief Security key set for both local and peer keys. */ -typedef struct -{ - ble_gap_sec_keys_t keys_own; /**< Keys distributed by the local device. For LE Secure Connections the encryption key will be generated locally and will always be stored if bonding. */ - ble_gap_sec_keys_t keys_peer; /**< Keys distributed by the remote device. For LE Secure Connections, p_enc_key must always be NULL. */ -} ble_gap_sec_keyset_t; - - -/**@brief Data Length Update Procedure parameters. */ -typedef struct -{ - uint16_t max_tx_octets; /**< Maximum number of payload octets that a Controller supports for transmission of a single Link Layer Data Channel PDU. */ - uint16_t max_rx_octets; /**< Maximum number of payload octets that a Controller supports for reception of a single Link Layer Data Channel PDU. */ - uint16_t max_tx_time_us; /**< Maximum time, in microseconds, that a Controller supports for transmission of a single Link Layer Data Channel PDU. */ - uint16_t max_rx_time_us; /**< Maximum time, in microseconds, that a Controller supports for reception of a single Link Layer Data Channel PDU. */ -} ble_gap_data_length_params_t; - - -/**@brief Data Length Update Procedure local limitation. */ -typedef struct -{ - uint16_t tx_payload_limited_octets; /**< If > 0, the requested TX packet length is too long by this many octets. */ - uint16_t rx_payload_limited_octets; /**< If > 0, the requested RX packet length is too long by this many octets. */ - uint16_t tx_rx_time_limited_us; /**< If > 0, the requested combination of TX and RX packet lengths is too long by this many microseconds. */ -} ble_gap_data_length_limitation_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_AUTH_STATUS. */ -typedef struct -{ - uint8_t auth_status; /**< Authentication status, see @ref BLE_GAP_SEC_STATUS. */ - uint8_t error_src : 2; /**< On error, source that caused the failure, see @ref BLE_GAP_SEC_STATUS_SOURCES. */ - uint8_t bonded : 1; /**< Procedure resulted in a bond. */ - uint8_t lesc : 1; /**< Procedure resulted in a LE Secure Connection. */ - ble_gap_sec_levels_t sm1_levels; /**< Levels supported in Security Mode 1. */ - ble_gap_sec_levels_t sm2_levels; /**< Levels supported in Security Mode 2. */ - ble_gap_sec_kdist_t kdist_own; /**< Bitmap stating which keys were exchanged (distributed) by the local device. If bonding with LE Secure Connections, the enc bit will be always set. */ - ble_gap_sec_kdist_t kdist_peer; /**< Bitmap stating which keys were exchanged (distributed) by the remote device. If bonding with LE Secure Connections, the enc bit will never be set. */ -} ble_gap_evt_auth_status_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_CONN_SEC_UPDATE. */ -typedef struct -{ - ble_gap_conn_sec_t conn_sec; /**< Connection security level. */ -} ble_gap_evt_conn_sec_update_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_TIMEOUT. */ -typedef struct -{ - uint8_t src; /**< Source of timeout event, see @ref BLE_GAP_TIMEOUT_SOURCES. */ -} ble_gap_evt_timeout_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_RSSI_CHANGED. */ -typedef struct -{ - int8_t rssi; /**< Received Signal Strength Indication in dBm. */ -} ble_gap_evt_rssi_changed_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_ADV_REPORT. */ -typedef struct -{ - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 - and the address is the device's identity address. */ - ble_gap_addr_t direct_addr; /**< Set when the scanner is unable to resolve the private resolvable address of the initiator - field of a directed advertisement packet and the scanner has been enabled to report this in @ref ble_gap_scan_params_t::adv_dir_report. */ - int8_t rssi; /**< Received Signal Strength Indication in dBm. */ - uint8_t scan_rsp : 1; /**< If 1, the report corresponds to a scan response and the type field may be ignored. */ - uint8_t type : 2; /**< See @ref BLE_GAP_ADV_TYPES. Only valid if the scan_rsp field is 0. */ - uint8_t dlen : 5; /**< Advertising or scan response data length. */ - uint8_t data[BLE_GAP_ADV_MAX_SIZE]; /**< Advertising or scan response data. */ -} ble_gap_evt_adv_report_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_SEC_REQUEST. */ -typedef struct -{ - uint8_t bond : 1; /**< Perform bonding. */ - uint8_t mitm : 1; /**< Man In The Middle protection requested. */ - uint8_t lesc : 1; /**< LE Secure Connections requested. */ - uint8_t keypress : 1; /**< Generation of keypress notifications requested. */ -} ble_gap_evt_sec_request_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST. */ -typedef struct -{ - ble_gap_conn_params_t conn_params; /**< GAP Connection Parameters. */ -} ble_gap_evt_conn_param_update_request_t; - - -/**@brief Event structure for @ref BLE_GAP_EVT_SCAN_REQ_REPORT. */ -typedef struct -{ - int8_t rssi; /**< Received Signal Strength Indication in dBm. */ - ble_gap_addr_t peer_addr; /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1 - and the address is the device's identity address. */ -} ble_gap_evt_scan_req_report_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST. */ -typedef struct -{ - ble_gap_data_length_params_t peer_params; /**< Peer data length parameters. */ -} ble_gap_evt_data_length_update_request_t; - -/**@brief Event structure for @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE. */ -typedef struct -{ - ble_gap_data_length_params_t effective_params; /**< The effective data length parameters. */ -} ble_gap_evt_data_length_update_t; - - -/**@brief GAP event structure. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which event occurred. */ - union /**< union alternative identified by evt_id in enclosing struct. */ - { - ble_gap_evt_connected_t connected; /**< Connected Event Parameters. */ - ble_gap_evt_disconnected_t disconnected; /**< Disconnected Event Parameters. */ - ble_gap_evt_conn_param_update_t conn_param_update; /**< Connection Parameter Update Parameters. */ - ble_gap_evt_sec_params_request_t sec_params_request; /**< Security Parameters Request Event Parameters. */ - ble_gap_evt_sec_info_request_t sec_info_request; /**< Security Information Request Event Parameters. */ - ble_gap_evt_passkey_display_t passkey_display; /**< Passkey Display Event Parameters. */ - ble_gap_evt_key_pressed_t key_pressed; /**< Key Pressed Event Parameters. */ - ble_gap_evt_auth_key_request_t auth_key_request; /**< Authentication Key Request Event Parameters. */ - ble_gap_evt_lesc_dhkey_request_t lesc_dhkey_request; /**< LE Secure Connections DHKey calculation request. */ - ble_gap_evt_auth_status_t auth_status; /**< Authentication Status Event Parameters. */ - ble_gap_evt_conn_sec_update_t conn_sec_update; /**< Connection Security Update Event Parameters. */ - ble_gap_evt_timeout_t timeout; /**< Timeout Event Parameters. */ - ble_gap_evt_rssi_changed_t rssi_changed; /**< RSSI Event Parameters. */ - ble_gap_evt_adv_report_t adv_report; /**< Advertising Report Event Parameters. */ - ble_gap_evt_sec_request_t sec_request; /**< Security Request Event Parameters. */ - ble_gap_evt_conn_param_update_request_t conn_param_update_request; /**< Connection Parameter Update Parameters. */ - ble_gap_evt_scan_req_report_t scan_req_report; /**< Scan Request Report Parameters. */ - ble_gap_evt_phy_update_request_t phy_update_request; /**< PHY Update Request Event Parameters. */ - ble_gap_evt_phy_update_t phy_update; /**< PHY Update Parameters. */ - ble_gap_evt_data_length_update_request_t data_length_update_request; /**< Data Length Update Request Event Parameters. */ - ble_gap_evt_data_length_update_t data_length_update; /**< Data Length Update Event Parameters. */ - } params; /**< Event Parameters. */ -} ble_gap_evt_t; - - -/** - * @brief BLE GAP connection configuration parameters, set with @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_CONN_COUNT The connection count for the connection configurations is zero. - * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: - * - The sum of conn_count for all connection configurations combined exceeds UINT8_MAX. - * - The event length is smaller than @ref BLE_GAP_EVENT_LENGTH_MIN. - */ -typedef struct -{ - uint8_t conn_count; /**< The number of concurrent connections the application can create with this configuration. - The default and minimum value is @ref BLE_GAP_CONN_COUNT_DEFAULT. */ - uint16_t event_length; /**< The time set aside for this connection on every connection interval in 1.25 ms units. - The default value is @ref BLE_GAP_EVENT_LENGTH_DEFAULT, the minimum value is @ref BLE_GAP_EVENT_LENGTH_MIN. - The event length and the connection interval are the primary parameters - for setting the throughput of a connection. - See the SoftDevice Specification for details on throughput. */ -} ble_gap_conn_cfg_t; - - -/** - * @brief Configuration of maximum concurrent connections in the different connected roles, set with - * @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_CONN_COUNT The sum of periph_role_count and central_role_count is too - * large. The maximum supported sum of concurrent connections is - * @ref BLE_GAP_ROLE_COUNT_COMBINED_MAX. - * @retval ::NRF_ERROR_INVALID_PARAM central_sec_count is larger than central_role_count. - */ -typedef struct -{ - uint8_t periph_role_count; /**< Maximum number of connections concurrently acting as a peripheral. Default value is @ref BLE_GAP_ROLE_COUNT_PERIPH_DEFAULT. */ - uint8_t central_role_count; /**< Maximum number of connections concurrently acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT. */ - uint8_t central_sec_count; /**< Number of SMP instances shared between all connections acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT. */ -} ble_gap_cfg_role_count_t; - - -/** - * @brief Device name and its properties, set with @ref sd_ble_cfg_set. - * - * @note If the device name is not configured, the default device name will be @ref - * BLE_GAP_DEVNAME_DEFAULT, the maximum device name length will be @ref - * BLE_GAP_DEVNAME_DEFAULT_LEN, vloc will be set to @ref BLE_GATTS_VLOC_STACK and the device name - * will have no write access. - * - * @note If @ref max_len is more than @ref BLE_GAP_DEVNAME_DEFAULT_LEN and vloc is set to @ref BLE_GATTS_VLOC_STACK, - * the attribute table size must be increased to have room for the longer device name (see - * @ref sd_ble_cfg_set and @ref ble_gatts_cfg_attr_tab_size_t). - * - * @note If vloc is @ref BLE_GATTS_VLOC_STACK : - * - p_value must point to non-volatile memory (flash) or be NULL. - * - If p_value is NULL, the device name will initially be empty. - * - * @note If vloc is @ref BLE_GATTS_VLOC_USER : - * - p_value cannot be NULL. - * - If the device name is writable, p_value must point to volatile memory (RAM). - * - * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: - * - Invalid device name location (vloc). - * - Invalid device name security mode. - * @retval ::NRF_ERROR_INVALID_LENGTH One or more of the following is true: - * - The device name length is invalid (must be between 0 and @ref BLE_GAP_DEVNAME_MAX_LEN). - * - The device name length is too long for the given Attribute Table. - * @retval ::NRF_ERROR_NOT_SUPPORTED Device name security mode is not supported. - */ -typedef struct -{ - ble_gap_conn_sec_mode_t write_perm; /**< Write permissions. */ - uint8_t vloc:2; /**< Value location, see @ref BLE_GATTS_VLOCS.*/ - uint8_t *p_value; /**< Pointer to where the value (device name) is stored or will be stored. */ - uint16_t current_len; /**< Current length in bytes of the memory pointed to by p_value.*/ - uint16_t max_len; /**< Maximum length in bytes of the memory pointed to by p_value.*/ -} ble_gap_cfg_device_name_t; - - -/**@brief Configuration structure for GAP configurations. */ -typedef union -{ - ble_gap_cfg_role_count_t role_count_cfg; /**< Role count configuration, cfg_id is @ref BLE_GAP_CFG_ROLE_COUNT. */ - ble_gap_cfg_device_name_t device_name_cfg; /**< Device name configuration, cfg_id is @ref BLE_GAP_CFG_DEVICE_NAME. */ -} ble_gap_cfg_t; - - -/**@brief Channel Map option. - * Used with @ref sd_ble_opt_get to get the current channel map - * or @ref sd_ble_opt_set to set a new channel map. When setting the - * channel map, it applies to all current and future connections. When getting the - * current channel map, it applies to a single connection and the connection handle - * must be supplied. - * - * @note Setting the channel map may take some time, depending on connection parameters. - * The time taken may be different for each connection and the get operation will - * return the previous channel map until the new one has taken effect. - * - * @note After setting the channel map, by spec it can not be set again until at least 1 s has passed. - * See Bluetooth Specification Version 4.1 Volume 2, Part E, Section 7.3.46. - * - * @retval ::NRF_SUCCESS Get or set successful. - * @retval ::NRF_ERROR_BUSY Channel map was set again before enough time had passed. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied for get. - * @retval ::NRF_ERROR_NOT_SUPPORTED Returned by sd_ble_opt_set in peripheral-only SoftDevices. - * - */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle (only applicable for get) */ - uint8_t ch_map[5]; /**< Channel Map (37-bit). */ -} ble_gap_opt_ch_map_t; - - -/**@brief Local connection latency option. - * - * Local connection latency is a feature which enables the slave to improve - * current consumption by ignoring the slave latency set by the peer. The - * local connection latency can only be set to a multiple of the slave latency, - * and cannot be longer than half of the supervision timeout. - * - * Used with @ref sd_ble_opt_set to set the local connection latency. The - * @ref sd_ble_opt_get is not supported for this option, but the actual - * local connection latency (unless set to NULL) is set as a return parameter - * when setting the option. - * - * @note The latency set will be truncated down to the closest slave latency event - * multiple, or the nearest multiple before half of the supervision timeout. - * - * @note The local connection latency is disabled by default, and needs to be enabled for new - * connections and whenever the connection is updated. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_NOT_SUPPORTED Get is not supported. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. - */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle */ - uint16_t requested_latency; /**< Requested local connection latency. */ - uint16_t * p_actual_latency; /**< Pointer to storage for the actual local connection latency (can be set to NULL to skip return value). */ -} ble_gap_opt_local_conn_latency_t; - -/**@brief Disable slave latency - * - * Used with @ref sd_ble_opt_set to temporarily disable slave latency of a peripheral connection (see @ref ble_gap_conn_params_t::slave_latency). And to re-enable it again. - * When disabled, the peripheral will ignore the slave_latency set by the central. - * - * @note Shall only be called on peripheral links. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_NOT_SUPPORTED Get is not supported. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. - */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle */ - uint8_t disable : 1; /**< Set to 1 to disable slave latency. Set to 0 enable it again.*/ -} ble_gap_opt_slave_latency_disable_t; - -/**@brief Passkey Option. - * - * Structure containing the passkey to be used during pairing. This can be used with @ref - * sd_ble_opt_set to make the SoftDevice use a preprogrammed passkey for authentication - * instead of generating a random one. - * - * @note Repeated pairing attempts using the same preprogrammed passkey makes pairing vulnerable to MITM attacks. - * - * @note @ref sd_ble_opt_get is not supported for this option. - * - */ -typedef struct -{ - uint8_t const * p_passkey; /**< Pointer to 6-digit ASCII string (digit 0..9 only, no NULL termination) passkey to be used during pairing. If this is NULL, the SoftDevice will generate a random passkey if required.*/ -} ble_gap_opt_passkey_t; - - -/**@brief Scan request report option. - * - * This can be used with @ref sd_ble_opt_set to make the SoftDevice send - * @ref BLE_GAP_EVT_SCAN_REQ_REPORT events. - * - * @note Due to the limited space reserved for scan request report events, - * not all received scan requests will be reported. - * - * @note If whitelisting is used, only whitelisted requests are reported. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_STATE When advertising is ongoing while the option is set. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable scan request reports. */ -} ble_gap_opt_scan_req_report_t; - -/**@brief Compatibility mode 1 option. - * - * This can be used with @ref sd_ble_opt_set to enable and disable - * compatibility mode 1. Compatibility mode 1 is disabled by default. - * - * @note Compatibility mode 1 enables interoperability with devices that do not support a value of - * 0 for the WinOffset parameter in the Link Layer CONNECT_IND packet. This applies to a - * limited set of legacy peripheral devices from another vendor. Enabling this compatibility - * mode will only have an effect if the local device will act as a central device and - * initiate a connection to a peripheral device. In that case it may lead to the connection - * creation taking up to one connection interval longer to complete for all connections. - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_STATE When connection creation is ongoing while mode 1 is set. - */ -typedef struct -{ - uint8_t enable : 1; /**< Enable compatibility mode 1.*/ -} ble_gap_opt_compat_mode_1_t; - -/**@brief Authenticated payload timeout option. - * - * This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other - * than the default of @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX. - * - * @note The authenticated payload timeout event ::BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD will be generated - * if auth_payload_timeout time has elapsed without receiving a packet with a valid MIC on an encrypted - * link. - * - * @note The LE ping procedure will be initiated before the timer expires to give the peer a chance - * to reset the timer. In addition the stack will try to prioritize running of LE ping over other - * activities to increase chances of finishing LE ping before timer expires. To avoid side-effects - * on other activities, it is recommended to use high timeout values. - * Recommended timeout > 2*(connInterval * (6 + connSlaveLatency)). - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. auth_payload_timeout was outside of allowed range. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter. - */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle */ - uint16_t auth_payload_timeout; /**< Requested timeout in 10 ms unit, see @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT. */ -} ble_gap_opt_auth_payload_timeout_t; - - -/**@brief Option structure for GAP options. */ -typedef union -{ - ble_gap_opt_ch_map_t ch_map; /**< Parameters for the Channel Map option. */ - ble_gap_opt_local_conn_latency_t local_conn_latency; /**< Parameters for the Local connection latency option */ - ble_gap_opt_passkey_t passkey; /**< Parameters for the Passkey option.*/ - ble_gap_opt_scan_req_report_t scan_req_report; /**< Parameters for the scan request report option.*/ - ble_gap_opt_compat_mode_1_t compat_mode_1; /**< Parameters for the compatibility mode 1 option.*/ - ble_gap_opt_auth_payload_timeout_t auth_payload_timeout; /**< Parameters for the authenticated payload timeout option.*/ - ble_gap_opt_slave_latency_disable_t slave_latency_disable; /**< Parameters for the Disable slave latency option */ -} ble_gap_opt_t; -/**@} */ - - -/**@addtogroup BLE_GAP_FUNCTIONS Functions - * @{ */ - -/**@brief Set the local Bluetooth identity address. - * - * The local Bluetooth identity address is the address that identifies this device to other peers. - * The address type must be either @ref BLE_GAP_ADDR_TYPE_PUBLIC or @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC. - * - * @note The identity address cannot be changed while advertising, scanning or creating a connection. - * - * @note This address will be distributed to the peer during bonding. - * If the address changes, the address stored in the peer device will not be valid and the ability to - * reconnect using the old address will be lost. - * - * @note By default the SoftDevice will set an address of type @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC upon being - * enabled. The address is a random number populated during the IC manufacturing process and remains unchanged - * for the lifetime of each IC. - * - * @mscs - * @mmsc{@ref BLE_GAP_ADV_MSC} - * @endmscs - * - * @param[in] p_addr Pointer to address structure. - * - * @retval ::NRF_SUCCESS Address successfully set. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_STATE The identity address cannot be changed while advertising, - * scanning or creating a connection. - */ -SVCALL(SD_BLE_GAP_ADDR_SET, uint32_t, sd_ble_gap_addr_set(ble_gap_addr_t const *p_addr)); - - -/**@brief Get local Bluetooth identity address. - * - * @note This will always return the identity address irrespective of the privacy settings, - * i.e. the address type will always be either @ref BLE_GAP_ADDR_TYPE_PUBLIC or @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC. - * - * @param[out] p_addr Pointer to address structure to be filled in. - * - * @retval ::NRF_SUCCESS Address successfully retrieved. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or NULL pointer supplied. - */ -SVCALL(SD_BLE_GAP_ADDR_GET, uint32_t, sd_ble_gap_addr_get(ble_gap_addr_t *p_addr)); - - -/**@brief Set the active whitelist in the SoftDevice. - * - * @note Only one whitelist can be used at a time and the whitelist is shared between the BLE roles. - * The whitelist cannot be set if a BLE role is using the whitelist. - * - * @note If an address is resolved using the information in the device identity list, then the whitelist - * filter policy applies to the peer identity address and not the resolvable address sent on air. - * - * @mscs - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_PRIVATE_SCAN_MSC} - * @endmscs - * - * @param[in] pp_wl_addrs Pointer to a whitelist of peer addresses, if NULL the whitelist will be cleared. - * @param[in] len Length of the whitelist, maximum @ref BLE_GAP_WHITELIST_ADDR_MAX_COUNT. - * - * @retval ::NRF_SUCCESS The whitelist is successfully set/cleared. - * @retval ::NRF_ERROR_INVALID_ADDR The whitelist (or one of its entries) provided is invalid. - * @retval ::BLE_ERROR_GAP_WHITELIST_IN_USE The whitelist is in use by a BLE role and cannot be set or cleared. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied. - * @retval ::NRF_ERROR_DATA_SIZE The given whitelist size is invalid (zero or too large); this can only return when - * pp_wl_addrs is not NULL. - */ -SVCALL(SD_BLE_GAP_WHITELIST_SET, uint32_t, sd_ble_gap_whitelist_set(ble_gap_addr_t const * const * pp_wl_addrs, uint8_t len)); - - -/**@brief Set device identity list. - * - * @note Only one device identity list can be used at a time and the list is shared between the BLE roles. - * The device identity list cannot be set if a BLE role is using the list. - * - * @param[in] pp_id_keys Pointer to an array of peer identity addresses and peer IRKs, if NULL the device identity list will be cleared. - * @param[in] pp_local_irks Pointer to an array of local IRKs. Each entry in the array maps to the entry in pp_id_keys at the same index. - * To fill in the list with the currently set device IRK for all peers, set to NULL. - * @param[in] len Length of the device identity list, maximum @ref BLE_GAP_DEVICE_IDENTITIES_MAX_COUNT. - * - * @mscs - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_PRIVATE_SCAN_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_CONN_PRIV_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_CONN_PRIV_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS The device identity list successfully set/cleared. - * @retval ::NRF_ERROR_INVALID_ADDR The device identity list (or one of its entries) provided is invalid. - * This code may be returned if the local IRK list also has an invalid entry. - * @retval ::BLE_ERROR_GAP_DEVICE_IDENTITIES_IN_USE The device identity list is in use and cannot be set or cleared. - * @retval ::BLE_ERROR_GAP_DEVICE_IDENTITIES_DUPLICATE The device identity list contains multiple entries with the same identity address. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied. - * @retval ::NRF_ERROR_DATA_SIZE The given device identity list size invalid (zero or too large); this can - * only return when pp_id_keys is not NULL. - */ -SVCALL(SD_BLE_GAP_DEVICE_IDENTITIES_SET, uint32_t, sd_ble_gap_device_identities_set(ble_gap_id_key_t const * const * pp_id_keys, ble_gap_irk_t const * const * pp_local_irks, uint8_t len)); - - -/**@brief Set privacy settings. - * - * @note Privacy settings cannot be changed while advertising, scanning or creating a connection. - * - * @param[in] p_privacy_params Privacy settings. - * - * @mscs - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Set successfully. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied. - * @retval ::NRF_ERROR_INVALID_ADDR The pointer to privacy settings is NULL or invalid. - * Otherwise, the p_device_irk pointer in privacy parameter is an invalid pointer. - * @retval ::NRF_ERROR_INVALID_PARAM Out of range parameters are provided. - * @retval ::NRF_ERROR_INVALID_STATE Privacy settings cannot be changed while advertising, scanning - * or creating a connection. - */ -SVCALL(SD_BLE_GAP_PRIVACY_SET, uint32_t, sd_ble_gap_privacy_set(ble_gap_privacy_params_t const *p_privacy_params)); - - -/**@brief Get privacy settings. - * - * @note ::ble_gap_privacy_params_t::p_device_irk must be initialized to NULL or a valid address before this function is called. - * If it is initialized to a valid address, the address pointed to will contain the current device IRK on return. - * - * @param[in,out] p_privacy_params Privacy settings. - * - * @retval ::NRF_SUCCESS Privacy settings read. - * @retval ::NRF_ERROR_INVALID_ADDR The pointer given for returning the privacy settings may be NULL or invalid. - * Otherwise, the p_device_irk pointer in privacy parameter is an invalid pointer. - */ -SVCALL(SD_BLE_GAP_PRIVACY_GET, uint32_t, sd_ble_gap_privacy_get(ble_gap_privacy_params_t *p_privacy_params)); - - -/**@brief Set, clear or update advertising and scan response data. - * - * @note The format of the advertising data will be checked by this call to ensure interoperability. - * Limitations imposed by this API call to the data provided include having a flags data type in the scan response data and - * duplicating the local name in the advertising data and scan response data. - * - * @note To clear the advertising data and set it to a 0-length packet, simply provide a valid pointer (p_data/p_sr_data) with its corresponding - * length (dlen/srdlen) set to 0. - * - * @note The call will fail if p_data and p_sr_data are both NULL since this would have no effect. - * - * @mscs - * @mmsc{@ref BLE_GAP_ADV_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @param[in] p_data Raw data to be placed in advertising packet. If NULL, no changes are made to the current advertising packet data. - * @param[in] dlen Data length for p_data. Max size: @ref BLE_GAP_ADV_MAX_SIZE octets. Should be 0 if p_data is NULL, can be 0 if p_data is not NULL. - * @param[in] p_sr_data Raw data to be placed in scan response packet. If NULL, no changes are made to the current scan response packet data. - * @param[in] srdlen Data length for p_sr_data. Max size: @ref BLE_GAP_ADV_MAX_SIZE octets. Should be 0 if p_sr_data is NULL, can be 0 if p_data is not NULL. - * - * @retval ::NRF_SUCCESS Advertising data successfully updated or cleared. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, both p_data and p_sr_data cannot be NULL. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_FLAGS Invalid combination of advertising flags supplied. - * @retval ::NRF_ERROR_INVALID_DATA Invalid data type(s) supplied, check the advertising data format specification. - * @retval ::NRF_ERROR_INVALID_LENGTH Invalid data length(s) supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported data type. - * @retval ::BLE_ERROR_GAP_UUID_LIST_MISMATCH Invalid UUID list supplied. - */ -SVCALL(SD_BLE_GAP_ADV_DATA_SET, uint32_t, sd_ble_gap_adv_data_set(uint8_t const *p_data, uint8_t dlen, uint8_t const *p_sr_data, uint8_t srdlen)); - - -/**@brief Start advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). - * - * @note Only one advertiser may be active at any time. - * - * @events - * @event{@ref BLE_GAP_EVT_CONNECTED, Generated after connection has been established through connectable advertising.} - * @event{@ref BLE_GAP_EVT_TIMEOUT, Advertisement has timed out.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_ADV_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_CONN_PRIV_MSC} - * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @param[in] p_adv_params Pointer to advertising parameters structure. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or @ref - * BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. If - * @ref ble_gap_adv_params_t::type is @ref BLE_GAP_ADV_TYPE_ADV_NONCONN_IND, - * this is ignored. - * - * @retval ::NRF_SUCCESS The BLE stack has started advertising. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached; connectable advertiser cannot be started. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check the accepted ranges and limits. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Bluetooth address supplied. - * @retval ::BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST Discoverable mode and whitelist incompatible. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Observer) and try again - */ -SVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(ble_gap_adv_params_t const *p_adv_params, uint8_t conn_cfg_tag)); - - -/**@brief Stop advertising (GAP Discoverable, Connectable modes, Broadcast Procedure). - * - * @mscs - * @mmsc{@ref BLE_GAP_ADV_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS The BLE stack has stopped advertising. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation (most probably not in advertising state). - */ -SVCALL(SD_BLE_GAP_ADV_STOP, uint32_t, sd_ble_gap_adv_stop(void)); - - - -/**@brief Update connection parameters. - * - * @details In the central role this will initiate a Link Layer connection parameter update procedure, - * otherwise in the peripheral role, this will send the corresponding L2CAP request and wait for - * the central to perform the procedure. In both cases, and regardless of success or failure, the application - * will be informed of the result with a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE event. - * - * @details This function can be used as a central both to reply to a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST or to start the procedure unrequested. - * - * @events - * @event{@ref BLE_GAP_EVT_CONN_PARAM_UPDATE, Result of the connection parameter update procedure.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CPU_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC} - * @mmsc{@ref BLE_GAP_MULTILINK_CPU_MSC} - * @mmsc{@ref BLE_GAP_MULTILINK_CTRL_PROC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_CPU_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_conn_params Pointer to desired connection parameters. If NULL is provided on a peripheral role, - * the parameters in the PPCP characteristic of the GAP service will be used instead. - * If NULL is provided on a central role and in response to a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST, the peripheral request will be rejected - * - * @retval ::NRF_SUCCESS The Connection Update procedure has been started successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_BUSY Procedure already in progress, wait for pending procedures to complete and retry. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - */ -SVCALL(SD_BLE_GAP_CONN_PARAM_UPDATE, uint32_t, sd_ble_gap_conn_param_update(uint16_t conn_handle, ble_gap_conn_params_t const *p_conn_params)); - - -/**@brief Disconnect (GAP Link Termination). - * - * @details This call initiates the disconnection procedure, and its completion will be communicated to the application - * with a @ref BLE_GAP_EVT_DISCONNECTED event. - * - * @events - * @event{@ref BLE_GAP_EVT_DISCONNECTED, Generated when disconnection procedure is complete.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CONN_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] hci_status_code HCI status code, see @ref BLE_HCI_STATUS_CODES (accepted values are @ref BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION and @ref BLE_HCI_CONN_INTERVAL_UNACCEPTABLE). - * - * @retval ::NRF_SUCCESS The disconnection procedure has been started successfully. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation (disconnection is already in progress). - */ -SVCALL(SD_BLE_GAP_DISCONNECT, uint32_t, sd_ble_gap_disconnect(uint16_t conn_handle, uint8_t hci_status_code)); - - -/**@brief Set the radio's transmit power. - * - * @param[in] tx_power Radio transmit power in dBm (accepted values are -40, -20, -16, -12, -8, -4, 0, 3, and 4 dBm). - * - * @retval ::NRF_SUCCESS Successfully changed the transmit power. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - */ -SVCALL(SD_BLE_GAP_TX_POWER_SET, uint32_t, sd_ble_gap_tx_power_set(int8_t tx_power)); - - -/**@brief Set GAP Appearance value. - * - * @param[in] appearance Appearance (16-bit), see @ref BLE_APPEARANCES. - * - * @retval ::NRF_SUCCESS Appearance value set successfully. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - */ -SVCALL(SD_BLE_GAP_APPEARANCE_SET, uint32_t, sd_ble_gap_appearance_set(uint16_t appearance)); - - -/**@brief Get GAP Appearance value. - * - * @param[out] p_appearance Pointer to appearance (16-bit) to be filled in, see @ref BLE_APPEARANCES. - * - * @retval ::NRF_SUCCESS Appearance value retrieved successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - */ -SVCALL(SD_BLE_GAP_APPEARANCE_GET, uint32_t, sd_ble_gap_appearance_get(uint16_t *p_appearance)); - - -/**@brief Set GAP Peripheral Preferred Connection Parameters. - * - * @param[in] p_conn_params Pointer to a @ref ble_gap_conn_params_t structure with the desired parameters. - * - * @retval ::NRF_SUCCESS Peripheral Preferred Connection Parameters set successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - */ -SVCALL(SD_BLE_GAP_PPCP_SET, uint32_t, sd_ble_gap_ppcp_set(ble_gap_conn_params_t const *p_conn_params)); - - -/**@brief Get GAP Peripheral Preferred Connection Parameters. - * - * @param[out] p_conn_params Pointer to a @ref ble_gap_conn_params_t structure where the parameters will be stored. - * - * @retval ::NRF_SUCCESS Peripheral Preferred Connection Parameters retrieved successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - */ -SVCALL(SD_BLE_GAP_PPCP_GET, uint32_t, sd_ble_gap_ppcp_get(ble_gap_conn_params_t *p_conn_params)); - - -/**@brief Set GAP device name. - * - * @note If the device name is located in application flash memory (see @ref ble_gap_cfg_device_name_t), - * it cannot be changed. Then @ref NRF_ERROR_FORBIDDEN will be returned. - * - * @param[in] p_write_perm Write permissions for the Device Name characteristic, see @ref ble_gap_conn_sec_mode_t. - * @param[in] p_dev_name Pointer to a UTF-8 encoded, non NULL-terminated string. - * @param[in] len Length of the UTF-8, non NULL-terminated string pointed to by p_dev_name in octets (must be smaller or equal than @ref BLE_GAP_DEVNAME_MAX_LEN). - * - * @retval ::NRF_SUCCESS GAP device name and permissions set successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - * @retval ::NRF_ERROR_FORBIDDEN Device name is not writable. - */ -SVCALL(SD_BLE_GAP_DEVICE_NAME_SET, uint32_t, sd_ble_gap_device_name_set(ble_gap_conn_sec_mode_t const *p_write_perm, uint8_t const *p_dev_name, uint16_t len)); - - -/**@brief Get GAP device name. - * - * @note If the device name is longer than the size of the supplied buffer, - * p_len will return the complete device name length, - * and not the number of bytes actually returned in p_dev_name. - * The application may use this information to allocate a suitable buffer size. - * - * @param[out] p_dev_name Pointer to an empty buffer where the UTF-8 non NULL-terminated string will be placed. Set to NULL to obtain the complete device name length. - * @param[in,out] p_len Length of the buffer pointed by p_dev_name, complete device name length on output. - * - * @retval ::NRF_SUCCESS GAP device name retrieved successfully. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - */ -SVCALL(SD_BLE_GAP_DEVICE_NAME_GET, uint32_t, sd_ble_gap_device_name_get(uint8_t *p_dev_name, uint16_t *p_len)); - - -/**@brief Initiate the GAP Authentication procedure. - * - * @details In the central role, this function will send an SMP Pairing Request (or an SMP Pairing Failed if rejected), - * otherwise in the peripheral role, an SMP Security Request will be sent. - * - * @events - * @event{Depending on the security parameters set and the packet exchanges with the peer\, the following events may be generated:} - * @event{@ref BLE_GAP_EVT_SEC_PARAMS_REQUEST} - * @event{@ref BLE_GAP_EVT_SEC_INFO_REQUEST} - * @event{@ref BLE_GAP_EVT_PASSKEY_DISPLAY} - * @event{@ref BLE_GAP_EVT_KEY_PRESSED} - * @event{@ref BLE_GAP_EVT_AUTH_KEY_REQUEST} - * @event{@ref BLE_GAP_EVT_LESC_DHKEY_REQUEST} - * @event{@ref BLE_GAP_EVT_CONN_SEC_UPDATE} - * @event{@ref BLE_GAP_EVT_AUTH_STATUS} - * @event{@ref BLE_GAP_EVT_TIMEOUT} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_SEC_REQ_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_SEC_REQ_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_sec_params Pointer to the @ref ble_gap_sec_params_t structure with the security parameters to be used during the pairing or bonding procedure. - * In the peripheral role, only the bond, mitm, lesc and keypress fields of this structure are used. - * In the central role, this pointer may be NULL to reject a Security Request. - * - * @retval ::NRF_SUCCESS Successfully initiated authentication procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_NO_MEM The maximum number of authentication procedures that can run in parallel for the given role is reached. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Setting of sign or link fields in @ref ble_gap_sec_kdist_t not supported. - * @retval ::NRF_ERROR_TIMEOUT A SMP timeout has occurred, and further SMP operations on this link is prohibited. - */ -SVCALL(SD_BLE_GAP_AUTHENTICATE, uint32_t, sd_ble_gap_authenticate(uint16_t conn_handle, ble_gap_sec_params_t const *p_sec_params)); - - -/**@brief Reply with GAP security parameters. - * - * @details This function is only used to reply to a @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. - * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. - * - * @events - * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_JW_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_PERIPH_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_CENTRAL_OOB_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_STATIC_PK_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_CONFIRM_FAIL_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_KS_TOO_SMALL_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_APP_ERROR_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_REMOTE_PAIRING_FAIL_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_TIMEOUT_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] sec_status Security status, see @ref BLE_GAP_SEC_STATUS. - * @param[in] p_sec_params Pointer to a @ref ble_gap_sec_params_t security parameters structure. In the central role this must be set to NULL, as the parameters have - * already been provided during a previous call to @ref sd_ble_gap_authenticate. - * @param[in,out] p_sec_keyset Pointer to a @ref ble_gap_sec_keyset_t security keyset structure. Any keys generated and/or distributed as a result of the ongoing security procedure - * will be stored into the memory referenced by the pointers inside this structure. The keys will be stored and available to the application - * upon reception of a @ref BLE_GAP_EVT_AUTH_STATUS event. - * Note that the SoftDevice expects the application to provide memory for storing the - * peer's keys. So it must be ensured that the relevant pointers inside this structure are not NULL. The pointers to the local key - * can, however, be NULL, in which case, the local key data will not be available to the application upon reception of the - * @ref BLE_GAP_EVT_AUTH_STATUS event. - * - * @retval ::NRF_SUCCESS Successfully accepted security parameter from the application. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED Setting of sign or link fields in @ref ble_gap_sec_kdist_t not supported. - */ -SVCALL(SD_BLE_GAP_SEC_PARAMS_REPLY, uint32_t, sd_ble_gap_sec_params_reply(uint16_t conn_handle, uint8_t sec_status, ble_gap_sec_params_t const *p_sec_params, ble_gap_sec_keyset_t const *p_sec_keyset)); - - -/**@brief Reply with an authentication key. - * - * @details This function is only used to reply to a @ref BLE_GAP_EVT_AUTH_KEY_REQUEST or a @ref BLE_GAP_EVT_PASSKEY_DISPLAY, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. - * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. - * - * @events - * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_CENTRAL_OOB_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] key_type See @ref BLE_GAP_AUTH_KEY_TYPES. - * @param[in] p_key If key type is @ref BLE_GAP_AUTH_KEY_TYPE_NONE, then NULL. - * If key type is @ref BLE_GAP_AUTH_KEY_TYPE_PASSKEY, then a 6-byte ASCII string (digit 0..9 only, no NULL termination) - * or NULL when confirming LE Secure Connections Numeric Comparison. - * If key type is @ref BLE_GAP_AUTH_KEY_TYPE_OOB, then a 16-byte OOB key value in little-endian format. - * - * @retval ::NRF_SUCCESS Authentication key successfully set. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_AUTH_KEY_REPLY, uint32_t, sd_ble_gap_auth_key_reply(uint16_t conn_handle, uint8_t key_type, uint8_t const *p_key)); - -/**@brief Reply with an LE Secure connections DHKey. - * - * @details This function is only used to reply to a @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE. - * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. - * - * @events - * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_PAIRING_JW_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_dhkey LE Secure Connections DHKey. - * - * @retval ::NRF_SUCCESS DHKey successfully set. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_LESC_DHKEY_REPLY, uint32_t, sd_ble_gap_lesc_dhkey_reply(uint16_t conn_handle, ble_gap_lesc_dhkey_t const *p_dhkey)); - -/**@brief Notify the peer of a local keypress. - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] kp_not See @ref BLE_GAP_KP_NOT_TYPES. - * - * @retval ::NRF_SUCCESS Keypress notification successfully queued for transmission. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either not entering a passkey or keypresses have not been enabled by both peers. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_BUSY The BLE stack is busy. Retry at later time. - */ -SVCALL(SD_BLE_GAP_KEYPRESS_NOTIFY, uint32_t, sd_ble_gap_keypress_notify(uint16_t conn_handle, uint8_t kp_not)); - -/**@brief Generate a set of OOB data to send to a peer out of band. - * - * @note The @ref ble_gap_addr_t included in the OOB data returned will be the currently active one (or, if a connection has already been established, - * the one used during connection setup). The application may manually overwrite it with an updated value. - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. Can be BLE_CONN_HANDLE_INVALID if a BLE connection has not been established yet. - * @param[in] p_pk_own LE Secure Connections local P-256 Public Key. - * @param[out] p_oobd_own The OOB data to be sent out of band to a peer. - * - * @retval ::NRF_SUCCESS OOB data successfully generated. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_LESC_OOB_DATA_GET, uint32_t, sd_ble_gap_lesc_oob_data_get(uint16_t conn_handle, ble_gap_lesc_p256_pk_t const *p_pk_own, ble_gap_lesc_oob_data_t *p_oobd_own)); - -/**@brief Provide the OOB data sent/received out of band. - * - * @note An authentication procedure with OOB selected as an algorithm must be in progress when calling this function. - * @note A @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST event with the oobd_req set to 1 must have been received prior to calling this function. - * - * @events - * @event{This function is used during authentication procedures\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_oobd_own The OOB data sent out of band to a peer or NULL if the peer has not received OOB data. - * Must correspond to @ref ble_gap_sec_params_t::oob flag in @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST. - * @param[in] p_oobd_peer The OOB data received out of band from a peer or NULL if none received. - * Must correspond to @ref ble_gap_sec_params_t::oob flag in @ref sd_ble_gap_authenticate in the central role - * or @ref sd_ble_gap_sec_params_reply in the peripheral role. - * - * @retval ::NRF_SUCCESS OOB data accepted. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_LESC_OOB_DATA_SET, uint32_t, sd_ble_gap_lesc_oob_data_set(uint16_t conn_handle, ble_gap_lesc_oob_data_t const *p_oobd_own, ble_gap_lesc_oob_data_t const *p_oobd_peer)); - -/**@brief Initiate GAP Encryption procedure. - * - * @details In the central role, this function will initiate the encryption procedure using the encryption information provided. - * - * @events - * @event{@ref BLE_GAP_EVT_CONN_SEC_UPDATE, The connection security has been updated.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_ENC_MSC} - * @mmsc{@ref BLE_GAP_MULTILINK_CTRL_PROC_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_SEC_REQ_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_master_id Pointer to a @ref ble_gap_master_id_t master identification structure. - * @param[in] p_enc_info Pointer to a @ref ble_gap_enc_info_t encryption information structure. - * - * @retval ::NRF_SUCCESS Successfully initiated authentication procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::BLE_ERROR_INVALID_ROLE Operation is not supported in the Peripheral role. - * @retval ::NRF_ERROR_BUSY Procedure already in progress or not allowed at this time, wait for pending procedures to complete and retry. - */ -SVCALL(SD_BLE_GAP_ENCRYPT, uint32_t, sd_ble_gap_encrypt(uint16_t conn_handle, ble_gap_master_id_t const *p_master_id, ble_gap_enc_info_t const *p_enc_info)); - - -/**@brief Reply with GAP security information. - * - * @details This function is only used to reply to a @ref BLE_GAP_EVT_SEC_INFO_REQUEST, calling it at other times will result in @ref NRF_ERROR_INVALID_STATE. - * @note If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters. - * @note Data signing is not yet supported, and p_sign_info must therefore be NULL. - * - * @mscs - * @mmsc{@ref BLE_GAP_PERIPH_ENC_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_enc_info Pointer to a @ref ble_gap_enc_info_t encryption information structure. May be NULL to signal none is available. - * @param[in] p_id_info Pointer to a @ref ble_gap_irk_t identity information structure. May be NULL to signal none is available. - * @param[in] p_sign_info Pointer to a @ref ble_gap_sign_info_t signing information structure. May be NULL to signal none is available. - * - * @retval ::NRF_SUCCESS Successfully accepted security information. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_SEC_INFO_REPLY, uint32_t, sd_ble_gap_sec_info_reply(uint16_t conn_handle, ble_gap_enc_info_t const *p_enc_info, ble_gap_irk_t const *p_id_info, ble_gap_sign_info_t const *p_sign_info)); - - -/**@brief Get the current connection security. - * - * @param[in] conn_handle Connection handle. - * @param[out] p_conn_sec Pointer to a @ref ble_gap_conn_sec_t structure to be filled in. - * - * @retval ::NRF_SUCCESS Current connection security successfully retrieved. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_CONN_SEC_GET, uint32_t, sd_ble_gap_conn_sec_get(uint16_t conn_handle, ble_gap_conn_sec_t *p_conn_sec)); - - -/**@brief Start reporting the received signal strength to the application. - * - * A new event is reported whenever the RSSI value changes, until @ref sd_ble_gap_rssi_stop is called. - * - * @events - * @event{@ref BLE_GAP_EVT_RSSI_CHANGED, New RSSI data available. How often the event is generated is - * dependent on the settings of the threshold_dbm - * and skip_count input parameters.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} - * @mmsc{@ref BLE_GAP_RSSI_FILT_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] threshold_dbm Minimum change in dBm before triggering the @ref BLE_GAP_EVT_RSSI_CHANGED event. Events are disabled if threshold_dbm equals @ref BLE_GAP_RSSI_THRESHOLD_INVALID. - * @param[in] skip_count Number of RSSI samples with a change of threshold_dbm or more before sending a new @ref BLE_GAP_EVT_RSSI_CHANGED event. - * - * @retval ::NRF_SUCCESS Successfully activated RSSI reporting. - * @retval ::NRF_ERROR_INVALID_STATE Disconnection in progress. Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_RSSI_START, uint32_t, sd_ble_gap_rssi_start(uint16_t conn_handle, uint8_t threshold_dbm, uint8_t skip_count)); - - -/**@brief Stop reporting the received signal strength. - * - * @note An RSSI change detected before the call but not yet received by the application - * may be reported after @ref sd_ble_gap_rssi_stop has been called. - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} - * @mmsc{@ref BLE_GAP_RSSI_FILT_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * - * @retval ::NRF_SUCCESS Successfully deactivated RSSI reporting. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - */ -SVCALL(SD_BLE_GAP_RSSI_STOP, uint32_t, sd_ble_gap_rssi_stop(uint16_t conn_handle)); - - -/**@brief Get the received signal strength for the last connection event. - * - * @ref sd_ble_gap_rssi_start must be called to start reporting RSSI before using this function. @ref NRF_ERROR_NOT_FOUND - * will be returned until RSSI was sampled for the first time after calling @ref sd_ble_gap_rssi_start. - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[out] p_rssi Pointer to the location where the RSSI measurement shall be stored. - * - * @retval ::NRF_SUCCESS Successfully read the RSSI. - * @retval ::NRF_ERROR_NOT_FOUND No sample is available. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_STATE RSSI reporting is not ongoing, or disconnection in progress. - */ -SVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi)); - - -/**@brief Start scanning (GAP Discovery procedure, Observer Procedure). - * - * @events - * @event{@ref BLE_GAP_EVT_ADV_REPORT, An advertising or scan response packet has been received.} - * @event{@ref BLE_GAP_EVT_TIMEOUT, Scanner has timed out.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_SCAN_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @param[in] p_scan_params Pointer to scan parameters structure. - * - * @retval ::NRF_SUCCESS Successfully initiated scanning procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again - */ -SVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_params_t const *p_scan_params)); - - -/**@brief Stop scanning (GAP Discovery procedure, Observer Procedure). - * - * @mscs - * @mmsc{@ref BLE_GAP_SCAN_MSC} - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Successfully stopped scanning procedure. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation (most probably not in scanning state). - */ -SVCALL(SD_BLE_GAP_SCAN_STOP, uint32_t, sd_ble_gap_scan_stop(void)); - - -/**@brief Create a connection (GAP Link Establishment). - * - * @note If a scanning procedure is currently in progress it will be automatically stopped when calling this function. - * The scanning procedure will be stopped even if the function returns an error. - * - * @mscs - * @mmsc{@ref BLE_GAP_WL_SHARE_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_CONN_PRIV_MSC} - * @mmsc{@ref BLE_GAP_CENTRAL_CONN_MSC} - * @endmscs - * - * @param[in] p_peer_addr Pointer to peer address. If the use_whitelist bit is set in @ref ble_gap_scan_params_t, then this is ignored. - * @param[in] p_scan_params Pointer to scan parameters structure. - * @param[in] p_conn_params Pointer to desired connection parameters. - * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or @ref - * BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. - * - * @retval ::NRF_SUCCESS Successfully initiated connection procedure. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid parameter(s) pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * - Invalid parameter(s) in p_scan_params or p_conn_params. - * - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set. - * - Peer address was not present in the device identity list, see @ref sd_ble_gap_device_identities_set. - * @retval ::NRF_ERROR_INVALID_STATE The SoftDevice is in an invalid state to perform this operation. This may be due to an - * existing locally initiated connect procedure, which must complete before initiating again. - * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Peer address. - * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached. - * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available. - * Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again - */ -SVCALL(SD_BLE_GAP_CONNECT, uint32_t, sd_ble_gap_connect(ble_gap_addr_t const *p_peer_addr, ble_gap_scan_params_t const *p_scan_params, ble_gap_conn_params_t const *p_conn_params, uint8_t conn_cfg_tag)); - - -/**@brief Cancel a connection establishment. - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_CONN_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Successfully canceled an ongoing connection procedure. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - */ -SVCALL(SD_BLE_GAP_CONNECT_CANCEL, uint32_t, sd_ble_gap_connect_cancel(void)); - - -/**@brief Initiate or respond to a PHY Update Procedure - * - * @details This function is used to initiate or respond to a PHY Update Procedure. It will always generate a - * @ref BLE_GAP_EVT_PHY_UPDATE event if successfully executed. If @ref ble_gap_phys_t::tx_phys or @ref ble_gap_phys_t::rx_phys - * is @ref BLE_GAP_PHY_AUTO, then the stack will select a PHY for the respective direction based on the peer's PHY preferences - * and the local stack configuration. If the peer does not support the PHY Update Procedure, then the - * resulting @ref BLE_GAP_EVT_PHY_UPDATE event will have a status set to - * @ref BLE_HCI_UNSUPPORTED_REMOTE_FEATURE. - * If the PHY procedure was rejected by the peer due to a procedure collision, the status will be - * @ref BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION or @ref BLE_HCI_DIFFERENT_TRANSACTION_COLLISION. - * If the peer responds to the PHY Update procedure with invalid parameters, the status will be @ref BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS. - * If the PHY procedure was rejected by the peer for a different reason, the status will contain the reason as specified by the peer. - * - * @events - * @event{@ref BLE_GAP_EVT_PHY_UPDATE, Result of the PHY Update Procedure.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GAP_CENTRAL_PHY_UPDATE} - * @mmsc{@ref BLE_GAP_PERIPHERAL_PHY_UPDATE} - * @endmscs - * - * @param[in] conn_handle Connection handle to indicate the connection for which the PHY Update is requested. - * @param[in] p_gap_phys Pointer to PHY structure. - * - * @retval ::NRF_SUCCESS Successfully requested a PHY Update. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Unsupported PHYs supplied to the call. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_BUSY Procedure is already in progress or not allowed at this time. Process pending events and wait for the pending procedure to complete and retry. - * - */ -SVCALL(SD_BLE_GAP_PHY_UPDATE, uint32_t, sd_ble_gap_phy_update(uint16_t conn_handle, ble_gap_phys_t const *p_gap_phys)); - -/**@brief Initiate or respond to a Data Length Update Procedure. - * - * @note Only symmetric input parameters for the Data Length Update is supported. Only @ref - * BLE_GAP_DATA_LENGTH_AUTO for max_tx_time_us and max_rx_time_us is supported. - * - * @note If the application uses @ref BLE_GAP_DATA_LENGTH_AUTO for one or more members of - * p_dl_params, the SoftDevice will choose the highest value supported in current - * configuration and connection parameters. - * - * @param[in] conn_handle Connection handle. - * @param[in] p_dl_params Pointer to local parameters to be used in Data Length Update - * Procedure. Set any member to @ref BLE_GAP_DATA_LENGTH_AUTO to let - * the SoftDevice automatically decide the value for that member. - * Set to NULL to use automatic values for all members. - * @param[out] p_dl_limitation Pointer to limitation to be written when local device does not - * have enough resources to accommodate the requested Data Length - * Update parameters. Ignored if NULL. - * - * @mscs - * @mmsc{@ref BLE_GAP_DATA_LENGTH_UPDATE_PROCEDURE_MSC} - * @endmscs - * - * @retval ::NRF_SUCCESS Successfully set Data Length Extension initiation/response parameters. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied. - * @retval ::NRF_ERROR_NOT_SUPPORTED The requested parameters are not supported by the SoftDevice. - * @retval ::NRF_ERROR_RESOURCES The requested parameters can not be accommodated. Inspect - * p_dl_limitation so see where the limitation is. - * @retval ::NRF_ERROR_BUSY Peer has already initiated a Data Length Update Procedure. Process the - * pending @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST event to respond. - */ -SVCALL(SD_BLE_GAP_DATA_LENGTH_UPDATE, uint32_t, sd_ble_gap_data_length_update(uint16_t conn_handle, ble_gap_data_length_params_t const *p_dl_params, ble_gap_data_length_limitation_t *p_dl_limitation)); - - - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // BLE_GAP_H__ - -/** - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gatt.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gatt.h deleted file mode 100644 index 4e054cf5c3..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gatt.h +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above 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 Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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. - */ - -/** - @addtogroup BLE_GATT Generic Attribute Profile (GATT) Common - @{ - @brief Common definitions and prototypes for the GATT interfaces. - */ - -#ifndef BLE_GATT_H__ -#define BLE_GATT_H__ - -#include "ble_types.h" -#include "ble_ranges.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_GATT_DEFINES Defines - * @{ */ - -/** @brief Default ATT MTU, in bytes. */ -#define BLE_GATT_ATT_MTU_DEFAULT 23 - -/**@brief Invalid Attribute Handle. */ -#define BLE_GATT_HANDLE_INVALID 0x0000 - -/**@brief First Attribute Handle. */ -#define BLE_GATT_HANDLE_START 0x0001 - -/**@brief Last Attribute Handle. */ -#define BLE_GATT_HANDLE_END 0xFFFF - -/** @defgroup BLE_GATT_TIMEOUT_SOURCES GATT Timeout sources - * @{ */ -#define BLE_GATT_TIMEOUT_SRC_PROTOCOL 0x00 /**< ATT Protocol timeout. */ -/** @} */ - -/** @defgroup BLE_GATT_WRITE_OPS GATT Write operations - * @{ */ -#define BLE_GATT_OP_INVALID 0x00 /**< Invalid Operation. */ -#define BLE_GATT_OP_WRITE_REQ 0x01 /**< Write Request. */ -#define BLE_GATT_OP_WRITE_CMD 0x02 /**< Write Command. */ -#define BLE_GATT_OP_SIGN_WRITE_CMD 0x03 /**< Signed Write Command. */ -#define BLE_GATT_OP_PREP_WRITE_REQ 0x04 /**< Prepare Write Request. */ -#define BLE_GATT_OP_EXEC_WRITE_REQ 0x05 /**< Execute Write Request. */ -/** @} */ - -/** @defgroup BLE_GATT_EXEC_WRITE_FLAGS GATT Execute Write flags - * @{ */ -#define BLE_GATT_EXEC_WRITE_FLAG_PREPARED_CANCEL 0x00 /**< Cancel prepared write. */ -#define BLE_GATT_EXEC_WRITE_FLAG_PREPARED_WRITE 0x01 /**< Execute prepared write. */ -/** @} */ - -/** @defgroup BLE_GATT_HVX_TYPES GATT Handle Value operations - * @{ */ -#define BLE_GATT_HVX_INVALID 0x00 /**< Invalid Operation. */ -#define BLE_GATT_HVX_NOTIFICATION 0x01 /**< Handle Value Notification. */ -#define BLE_GATT_HVX_INDICATION 0x02 /**< Handle Value Indication. */ -/** @} */ - -/** @defgroup BLE_GATT_STATUS_CODES GATT Status Codes - * @{ */ -#define BLE_GATT_STATUS_SUCCESS 0x0000 /**< Success. */ -#define BLE_GATT_STATUS_UNKNOWN 0x0001 /**< Unknown or not applicable status. */ -#define BLE_GATT_STATUS_ATTERR_INVALID 0x0100 /**< ATT Error: Invalid Error Code. */ -#define BLE_GATT_STATUS_ATTERR_INVALID_HANDLE 0x0101 /**< ATT Error: Invalid Attribute Handle. */ -#define BLE_GATT_STATUS_ATTERR_READ_NOT_PERMITTED 0x0102 /**< ATT Error: Read not permitted. */ -#define BLE_GATT_STATUS_ATTERR_WRITE_NOT_PERMITTED 0x0103 /**< ATT Error: Write not permitted. */ -#define BLE_GATT_STATUS_ATTERR_INVALID_PDU 0x0104 /**< ATT Error: Used in ATT as Invalid PDU. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_AUTHENTICATION 0x0105 /**< ATT Error: Authenticated link required. */ -#define BLE_GATT_STATUS_ATTERR_REQUEST_NOT_SUPPORTED 0x0106 /**< ATT Error: Used in ATT as Request Not Supported. */ -#define BLE_GATT_STATUS_ATTERR_INVALID_OFFSET 0x0107 /**< ATT Error: Offset specified was past the end of the attribute. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_AUTHORIZATION 0x0108 /**< ATT Error: Used in ATT as Insufficient Authorization. */ -#define BLE_GATT_STATUS_ATTERR_PREPARE_QUEUE_FULL 0x0109 /**< ATT Error: Used in ATT as Prepare Queue Full. */ -#define BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND 0x010A /**< ATT Error: Used in ATT as Attribute not found. */ -#define BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_LONG 0x010B /**< ATT Error: Attribute cannot be read or written using read/write blob requests. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_ENC_KEY_SIZE 0x010C /**< ATT Error: Encryption key size used is insufficient. */ -#define BLE_GATT_STATUS_ATTERR_INVALID_ATT_VAL_LENGTH 0x010D /**< ATT Error: Invalid value size. */ -#define BLE_GATT_STATUS_ATTERR_UNLIKELY_ERROR 0x010E /**< ATT Error: Very unlikely error. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_ENCRYPTION 0x010F /**< ATT Error: Encrypted link required. */ -#define BLE_GATT_STATUS_ATTERR_UNSUPPORTED_GROUP_TYPE 0x0110 /**< ATT Error: Attribute type is not a supported grouping attribute. */ -#define BLE_GATT_STATUS_ATTERR_INSUF_RESOURCES 0x0111 /**< ATT Error: Encrypted link required. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE1_BEGIN 0x0112 /**< ATT Error: Reserved for Future Use range #1 begin. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE1_END 0x017F /**< ATT Error: Reserved for Future Use range #1 end. */ -#define BLE_GATT_STATUS_ATTERR_APP_BEGIN 0x0180 /**< ATT Error: Application range begin. */ -#define BLE_GATT_STATUS_ATTERR_APP_END 0x019F /**< ATT Error: Application range end. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE2_BEGIN 0x01A0 /**< ATT Error: Reserved for Future Use range #2 begin. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE2_END 0x01DF /**< ATT Error: Reserved for Future Use range #2 end. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE3_BEGIN 0x01E0 /**< ATT Error: Reserved for Future Use range #3 begin. */ -#define BLE_GATT_STATUS_ATTERR_RFU_RANGE3_END 0x01FC /**< ATT Error: Reserved for Future Use range #3 end. */ -#define BLE_GATT_STATUS_ATTERR_CPS_CCCD_CONFIG_ERROR 0x01FD /**< ATT Common Profile and Service Error: Client Characteristic Configuration Descriptor improperly configured. */ -#define BLE_GATT_STATUS_ATTERR_CPS_PROC_ALR_IN_PROG 0x01FE /**< ATT Common Profile and Service Error: Procedure Already in Progress. */ -#define BLE_GATT_STATUS_ATTERR_CPS_OUT_OF_RANGE 0x01FF /**< ATT Common Profile and Service Error: Out Of Range. */ -/** @} */ - - -/** @defgroup BLE_GATT_CPF_FORMATS Characteristic Presentation Formats - * @note Found at http://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml - * @{ */ -#define BLE_GATT_CPF_FORMAT_RFU 0x00 /**< Reserved For Future Use. */ -#define BLE_GATT_CPF_FORMAT_BOOLEAN 0x01 /**< Boolean. */ -#define BLE_GATT_CPF_FORMAT_2BIT 0x02 /**< Unsigned 2-bit integer. */ -#define BLE_GATT_CPF_FORMAT_NIBBLE 0x03 /**< Unsigned 4-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT8 0x04 /**< Unsigned 8-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT12 0x05 /**< Unsigned 12-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT16 0x06 /**< Unsigned 16-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT24 0x07 /**< Unsigned 24-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT32 0x08 /**< Unsigned 32-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT48 0x09 /**< Unsigned 48-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT64 0x0A /**< Unsigned 64-bit integer. */ -#define BLE_GATT_CPF_FORMAT_UINT128 0x0B /**< Unsigned 128-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT8 0x0C /**< Signed 2-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT12 0x0D /**< Signed 12-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT16 0x0E /**< Signed 16-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT24 0x0F /**< Signed 24-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT32 0x10 /**< Signed 32-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT48 0x11 /**< Signed 48-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT64 0x12 /**< Signed 64-bit integer. */ -#define BLE_GATT_CPF_FORMAT_SINT128 0x13 /**< Signed 128-bit integer. */ -#define BLE_GATT_CPF_FORMAT_FLOAT32 0x14 /**< IEEE-754 32-bit floating point. */ -#define BLE_GATT_CPF_FORMAT_FLOAT64 0x15 /**< IEEE-754 64-bit floating point. */ -#define BLE_GATT_CPF_FORMAT_SFLOAT 0x16 /**< IEEE-11073 16-bit SFLOAT. */ -#define BLE_GATT_CPF_FORMAT_FLOAT 0x17 /**< IEEE-11073 32-bit FLOAT. */ -#define BLE_GATT_CPF_FORMAT_DUINT16 0x18 /**< IEEE-20601 format. */ -#define BLE_GATT_CPF_FORMAT_UTF8S 0x19 /**< UTF-8 string. */ -#define BLE_GATT_CPF_FORMAT_UTF16S 0x1A /**< UTF-16 string. */ -#define BLE_GATT_CPF_FORMAT_STRUCT 0x1B /**< Opaque Structure. */ -/** @} */ - -/** @defgroup BLE_GATT_CPF_NAMESPACES GATT Bluetooth Namespaces - * @{ - */ -#define BLE_GATT_CPF_NAMESPACE_BTSIG 0x01 /**< Bluetooth SIG defined Namespace. */ -#define BLE_GATT_CPF_NAMESPACE_DESCRIPTION_UNKNOWN 0x0000 /**< Namespace Description Unknown. */ -/** @} */ - -/** @} */ - -/** @addtogroup BLE_GATT_STRUCTURES Structures - * @{ */ - -/** - * @brief BLE GATT connection configuration parameters, set with @ref sd_ble_cfg_set. - * - * @retval NRF_ERROR_INVALID_PARAM att_mtu is smaller than @ref BLE_GATT_ATT_MTU_DEFAULT. - */ -typedef struct -{ - uint16_t att_mtu; /**< Maximum size of ATT packet the SoftDevice can send or receive. - The default and minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. - @mscs - @mmsc{@ref BLE_GATTC_MTU_EXCHANGE} - @mmsc{@ref BLE_GATTS_MTU_EXCHANGE} - @endmscs - */ -} ble_gatt_conn_cfg_t; - -/**@brief GATT Characteristic Properties. */ -typedef struct -{ - /* Standard properties */ - uint8_t broadcast :1; /**< Broadcasting of the value permitted. */ - uint8_t read :1; /**< Reading the value permitted. */ - uint8_t write_wo_resp :1; /**< Writing the value with Write Command permitted. */ - uint8_t write :1; /**< Writing the value with Write Request permitted. */ - uint8_t notify :1; /**< Notification of the value permitted. */ - uint8_t indicate :1; /**< Indications of the value permitted. */ - uint8_t auth_signed_wr :1; /**< Writing the value with Signed Write Command permitted. */ -} ble_gatt_char_props_t; - -/**@brief GATT Characteristic Extended Properties. */ -typedef struct -{ - /* Extended properties */ - uint8_t reliable_wr :1; /**< Writing the value with Queued Write operations permitted. */ - uint8_t wr_aux :1; /**< Writing the Characteristic User Description descriptor permitted. */ -} ble_gatt_char_ext_props_t; - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // BLE_GATT_H__ - -/** @} */ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gattc.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gattc.h deleted file mode 100644 index 191f3a85ea..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gattc.h +++ /dev/null @@ -1,702 +0,0 @@ -/* - * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above 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 Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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. - */ - -/** - @addtogroup BLE_GATTC Generic Attribute Profile (GATT) Client - @{ - @brief Definitions and prototypes for the GATT Client interface. - */ - -#ifndef BLE_GATTC_H__ -#define BLE_GATTC_H__ - -#include "ble_gatt.h" -#include "ble_types.h" -#include "ble_ranges.h" -#include "nrf_svc.h" -#include "nrf_error.h" -#include "nrf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_GATTC_ENUMERATIONS Enumerations - * @{ */ - -/**@brief GATTC API SVC numbers. */ -enum BLE_GATTC_SVCS -{ - SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER = BLE_GATTC_SVC_BASE, /**< Primary Service Discovery. */ - SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, /**< Relationship Discovery. */ - SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, /**< Characteristic Discovery. */ - SD_BLE_GATTC_DESCRIPTORS_DISCOVER, /**< Characteristic Descriptor Discovery. */ - SD_BLE_GATTC_ATTR_INFO_DISCOVER, /**< Attribute Information Discovery. */ - SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, /**< Read Characteristic Value by UUID. */ - SD_BLE_GATTC_READ, /**< Generic read. */ - SD_BLE_GATTC_CHAR_VALUES_READ, /**< Read multiple Characteristic Values. */ - SD_BLE_GATTC_WRITE, /**< Generic write. */ - SD_BLE_GATTC_HV_CONFIRM, /**< Handle Value Confirmation. */ - SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, /**< Exchange MTU Request. */ -}; - -/** - * @brief GATT Client Event IDs. - */ -enum BLE_GATTC_EVTS -{ - BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP = BLE_GATTC_EVT_BASE, /**< Primary Service Discovery Response event. \n See @ref ble_gattc_evt_prim_srvc_disc_rsp_t. */ - BLE_GATTC_EVT_REL_DISC_RSP, /**< Relationship Discovery Response event. \n See @ref ble_gattc_evt_rel_disc_rsp_t. */ - BLE_GATTC_EVT_CHAR_DISC_RSP, /**< Characteristic Discovery Response event. \n See @ref ble_gattc_evt_char_disc_rsp_t. */ - BLE_GATTC_EVT_DESC_DISC_RSP, /**< Descriptor Discovery Response event. \n See @ref ble_gattc_evt_desc_disc_rsp_t. */ - BLE_GATTC_EVT_ATTR_INFO_DISC_RSP, /**< Attribute Information Response event. \n See @ref ble_gattc_evt_attr_info_disc_rsp_t. */ - BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP, /**< Read By UUID Response event. \n See @ref ble_gattc_evt_char_val_by_uuid_read_rsp_t. */ - BLE_GATTC_EVT_READ_RSP, /**< Read Response event. \n See @ref ble_gattc_evt_read_rsp_t. */ - BLE_GATTC_EVT_CHAR_VALS_READ_RSP, /**< Read multiple Response event. \n See @ref ble_gattc_evt_char_vals_read_rsp_t. */ - BLE_GATTC_EVT_WRITE_RSP, /**< Write Response event. \n See @ref ble_gattc_evt_write_rsp_t. */ - BLE_GATTC_EVT_HVX, /**< Handle Value Notification or Indication event. \n Confirm indication with @ref sd_ble_gattc_hv_confirm. \n See @ref ble_gattc_evt_hvx_t. */ - BLE_GATTC_EVT_EXCHANGE_MTU_RSP, /**< Exchange MTU Response event. \n See @ref ble_gattc_evt_exchange_mtu_rsp_t. */ - BLE_GATTC_EVT_TIMEOUT, /**< Timeout event. \n See @ref ble_gattc_evt_timeout_t. */ - BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE /**< Write without Response transmission complete. \n See @ref ble_gattc_evt_write_cmd_tx_complete_t. */ -}; - -/** @} */ - -/** @addtogroup BLE_GATTC_DEFINES Defines - * @{ */ - -/** @defgroup BLE_ERRORS_GATTC SVC return values specific to GATTC - * @{ */ -#define BLE_ERROR_GATTC_PROC_NOT_PERMITTED (NRF_GATTC_ERR_BASE + 0x000) /**< Procedure not Permitted. */ -/** @} */ - -/** @defgroup BLE_GATTC_ATTR_INFO_FORMAT Attribute Information Formats - * @{ */ -#define BLE_GATTC_ATTR_INFO_FORMAT_16BIT 1 /**< 16-bit Attribute Information Format. */ -#define BLE_GATTC_ATTR_INFO_FORMAT_128BIT 2 /**< 128-bit Attribute Information Format. */ -/** @} */ - -/** @defgroup BLE_GATTC_DEFAULTS GATT Client defaults - * @{ */ -#define BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT 1 /**< Default number of Write without Response that can be queued for transmission. */ -/** @} */ - -/** @} */ - -/** @addtogroup BLE_GATTC_STRUCTURES Structures - * @{ */ - -/** - * @brief BLE GATTC connection configuration parameters, set with @ref sd_ble_cfg_set. - */ -typedef struct -{ - uint8_t write_cmd_tx_queue_size; /**< The guaranteed minimum number of Write without Response that can be queued for transmission. - The default value is @ref BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT */ -} ble_gattc_conn_cfg_t; - -/**@brief Operation Handle Range. */ -typedef struct -{ - uint16_t start_handle; /**< Start Handle. */ - uint16_t end_handle; /**< End Handle. */ -} ble_gattc_handle_range_t; - - -/**@brief GATT service. */ -typedef struct -{ - ble_uuid_t uuid; /**< Service UUID. */ - ble_gattc_handle_range_t handle_range; /**< Service Handle Range. */ -} ble_gattc_service_t; - - -/**@brief GATT include. */ -typedef struct -{ - uint16_t handle; /**< Include Handle. */ - ble_gattc_service_t included_srvc; /**< Handle of the included service. */ -} ble_gattc_include_t; - - -/**@brief GATT characteristic. */ -typedef struct -{ - ble_uuid_t uuid; /**< Characteristic UUID. */ - ble_gatt_char_props_t char_props; /**< Characteristic Properties. */ - uint8_t char_ext_props : 1; /**< Extended properties present. */ - uint16_t handle_decl; /**< Handle of the Characteristic Declaration. */ - uint16_t handle_value; /**< Handle of the Characteristic Value. */ -} ble_gattc_char_t; - - -/**@brief GATT descriptor. */ -typedef struct -{ - uint16_t handle; /**< Descriptor Handle. */ - ble_uuid_t uuid; /**< Descriptor UUID. */ -} ble_gattc_desc_t; - - -/**@brief Write Parameters. */ -typedef struct -{ - uint8_t write_op; /**< Write Operation to be performed, see @ref BLE_GATT_WRITE_OPS. */ - uint8_t flags; /**< Flags, see @ref BLE_GATT_EXEC_WRITE_FLAGS. */ - uint16_t handle; /**< Handle to the attribute to be written. */ - uint16_t offset; /**< Offset in bytes. @note For WRITE_CMD and WRITE_REQ, offset must be 0. */ - uint16_t len; /**< Length of data in bytes. */ - uint8_t const *p_value; /**< Pointer to the value data. */ -} ble_gattc_write_params_t; - -/**@brief Attribute Information for 16-bit Attribute UUID. */ -typedef struct -{ - uint16_t handle; /**< Attribute handle. */ - ble_uuid_t uuid; /**< 16-bit Attribute UUID. */ -} ble_gattc_attr_info16_t; - -/**@brief Attribute Information for 128-bit Attribute UUID. */ -typedef struct -{ - uint16_t handle; /**< Attribute handle. */ - ble_uuid128_t uuid; /**< 128-bit Attribute UUID. */ -} ble_gattc_attr_info128_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Service count. */ - ble_gattc_service_t services[1]; /**< Service data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_prim_srvc_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_REL_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Include count. */ - ble_gattc_include_t includes[1]; /**< Include data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_rel_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Characteristic count. */ - ble_gattc_char_t chars[1]; /**< Characteristic data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_char_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_DESC_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Descriptor count. */ - ble_gattc_desc_t descs[1]; /**< Descriptor data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_desc_disc_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_ATTR_INFO_DISC_RSP. */ -typedef struct -{ - uint16_t count; /**< Attribute count. */ - uint8_t format; /**< Attribute information format, see @ref BLE_GATTC_ATTR_INFO_FORMAT. */ - union { - ble_gattc_attr_info16_t attr_info16[1]; /**< Attribute information for 16-bit Attribute UUID. - @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ - ble_gattc_attr_info128_t attr_info128[1]; /**< Attribute information for 128-bit Attribute UUID. - @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ - } info; /**< Attribute information union. */ -} ble_gattc_evt_attr_info_disc_rsp_t; - -/**@brief GATT read by UUID handle value pair. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - uint8_t *p_value; /**< Pointer to the Attribute Value, length is available in @ref ble_gattc_evt_char_val_by_uuid_read_rsp_t::value_len. */ -} ble_gattc_handle_value_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP. */ -typedef struct -{ - uint16_t count; /**< Handle-Value Pair Count. */ - uint16_t value_len; /**< Length of the value in Handle-Value(s) list. */ - uint8_t handle_value[1]; /**< Handle-Value(s) list. To iterate through the list use @ref sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter. - @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_char_val_by_uuid_read_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_READ_RSP. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - uint16_t offset; /**< Offset of the attribute data. */ - uint16_t len; /**< Attribute data length. */ - uint8_t data[1]; /**< Attribute data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_read_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_VALS_READ_RSP. */ -typedef struct -{ - uint16_t len; /**< Concatenated Attribute values length. */ - uint8_t values[1]; /**< Attribute values. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_char_vals_read_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_WRITE_RSP. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - uint8_t write_op; /**< Type of write operation, see @ref BLE_GATT_WRITE_OPS. */ - uint16_t offset; /**< Data offset. */ - uint16_t len; /**< Data length. */ - uint8_t data[1]; /**< Data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_write_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_HVX. */ -typedef struct -{ - uint16_t handle; /**< Handle to which the HVx operation applies. */ - uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ - uint16_t len; /**< Attribute data length. */ - uint8_t data[1]; /**< Attribute data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gattc_evt_hvx_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP. */ -typedef struct -{ - uint16_t server_rx_mtu; /**< Server RX MTU size. */ -} ble_gattc_evt_exchange_mtu_rsp_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_TIMEOUT. */ -typedef struct -{ - uint8_t src; /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */ -} ble_gattc_evt_timeout_t; - -/**@brief Event structure for @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE. */ -typedef struct -{ - uint8_t count; /**< Number of write without response transmissions completed. */ -} ble_gattc_evt_write_cmd_tx_complete_t; - -/**@brief GATTC event structure. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which event occurred. */ - uint16_t gatt_status; /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */ - uint16_t error_handle; /**< In case of error: The handle causing the error. In all other cases @ref BLE_GATT_HANDLE_INVALID. */ - union - { - ble_gattc_evt_prim_srvc_disc_rsp_t prim_srvc_disc_rsp; /**< Primary Service Discovery Response Event Parameters. */ - ble_gattc_evt_rel_disc_rsp_t rel_disc_rsp; /**< Relationship Discovery Response Event Parameters. */ - ble_gattc_evt_char_disc_rsp_t char_disc_rsp; /**< Characteristic Discovery Response Event Parameters. */ - ble_gattc_evt_desc_disc_rsp_t desc_disc_rsp; /**< Descriptor Discovery Response Event Parameters. */ - ble_gattc_evt_char_val_by_uuid_read_rsp_t char_val_by_uuid_read_rsp; /**< Characteristic Value Read by UUID Response Event Parameters. */ - ble_gattc_evt_read_rsp_t read_rsp; /**< Read Response Event Parameters. */ - ble_gattc_evt_char_vals_read_rsp_t char_vals_read_rsp; /**< Characteristic Values Read Response Event Parameters. */ - ble_gattc_evt_write_rsp_t write_rsp; /**< Write Response Event Parameters. */ - ble_gattc_evt_hvx_t hvx; /**< Handle Value Notification/Indication Event Parameters. */ - ble_gattc_evt_exchange_mtu_rsp_t exchange_mtu_rsp; /**< Exchange MTU Response Event Parameters. */ - ble_gattc_evt_timeout_t timeout; /**< Timeout Event Parameters. */ - ble_gattc_evt_attr_info_disc_rsp_t attr_info_disc_rsp; /**< Attribute Information Discovery Event Parameters. */ - ble_gattc_evt_write_cmd_tx_complete_t write_cmd_tx_complete; /**< Write without Response transmission complete Event Parameters. */ - } params; /**< Event Parameters. @note Only valid if @ref gatt_status == @ref BLE_GATT_STATUS_SUCCESS. */ -} ble_gattc_evt_t; -/** @} */ - -/** @addtogroup BLE_GATTC_FUNCTIONS Functions - * @{ */ - -/**@brief Initiate or continue a GATT Primary Service Discovery procedure. - * - * @details This function initiates or resumes a Primary Service discovery procedure, starting from the supplied handle. - * If the last service has not been reached, this function must be called again with an updated start handle value to continue the search. - * - * @note If any of the discovered services have 128-bit UUIDs which are not present in the table provided to ble_vs_uuids_assign, a UUID structure with - * type @ref BLE_UUID_TYPE_UNKNOWN will be received in the corresponding event. - * - * @events - * @event{@ref BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_PRIM_SRVC_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] start_handle Handle to start searching from. - * @param[in] p_srvc_uuid Pointer to the service UUID to be found. If it is NULL, all primary services will be returned. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Primary Service Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER, uint32_t, sd_ble_gattc_primary_services_discover(uint16_t conn_handle, uint16_t start_handle, ble_uuid_t const *p_srvc_uuid)); - - -/**@brief Initiate or continue a GATT Relationship Discovery procedure. - * - * @details This function initiates or resumes the Find Included Services sub-procedure. If the last included service has not been reached, - * this must be called again with an updated handle range to continue the search. - * - * @events - * @event{@ref BLE_GATTC_EVT_REL_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_REL_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Relationship Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, uint32_t, sd_ble_gattc_relationships_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Characteristic Discovery procedure. - * - * @details This function initiates or resumes a Characteristic discovery procedure. If the last Characteristic has not been reached, - * this must be called again with an updated handle range to continue the discovery. - * - * @note If any of the discovered characteristics have 128-bit UUIDs which are not present in the table provided to ble_vs_uuids_assign, a UUID structure with - * type @ref BLE_UUID_TYPE_UNKNOWN will be received in the corresponding event. - * - * @events - * @event{@ref BLE_GATTC_EVT_CHAR_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_CHAR_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Characteristic Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, uint32_t, sd_ble_gattc_characteristics_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Characteristic Descriptor Discovery procedure. - * - * @details This function initiates or resumes a Characteristic Descriptor discovery procedure. If the last Descriptor has not been reached, - * this must be called again with an updated handle range to continue the discovery. - * - * @events - * @event{@ref BLE_GATTC_EVT_DESC_DISC_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_DESC_DISC_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range A pointer to the range of handles of the Characteristic to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Descriptor Discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_DESCRIPTORS_DISCOVER, uint32_t, sd_ble_gattc_descriptors_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Read using Characteristic UUID procedure. - * - * @details This function initiates or resumes a Read using Characteristic UUID procedure. If the last Characteristic has not been reached, - * this must be called again with an updated handle range to continue the discovery. - * - * @events - * @event{@ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_READ_UUID_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_uuid Pointer to a Characteristic value UUID to read. - * @param[in] p_handle_range A pointer to the range of handles to perform this procedure on. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Read using Characteristic UUID procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, uint32_t, sd_ble_gattc_char_value_by_uuid_read(uint16_t conn_handle, ble_uuid_t const *p_uuid, ble_gattc_handle_range_t const *p_handle_range)); - - -/**@brief Initiate or continue a GATT Read (Long) Characteristic or Descriptor procedure. - * - * @details This function initiates or resumes a GATT Read (Long) Characteristic or Descriptor procedure. If the Characteristic or Descriptor - * to be read is longer than ATT_MTU - 1, this function must be called multiple times with appropriate offset to read the - * complete value. - * - * @events - * @event{@ref BLE_GATTC_EVT_READ_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_VALUE_READ_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] handle The handle of the attribute to be read. - * @param[in] offset Offset into the attribute value to be read. - * - * @retval ::NRF_SUCCESS Successfully started or resumed the Read (Long) procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_READ, uint32_t, sd_ble_gattc_read(uint16_t conn_handle, uint16_t handle, uint16_t offset)); - - -/**@brief Initiate a GATT Read Multiple Characteristic Values procedure. - * - * @details This function initiates a GATT Read Multiple Characteristic Values procedure. - * - * @events - * @event{@ref BLE_GATTC_EVT_CHAR_VALS_READ_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_READ_MULT_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handles A pointer to the handle(s) of the attribute(s) to be read. - * @param[in] handle_count The number of handles in p_handles. - * - * @retval ::NRF_SUCCESS Successfully started the Read Multiple Characteristic Values procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_CHAR_VALUES_READ, uint32_t, sd_ble_gattc_char_values_read(uint16_t conn_handle, uint16_t const *p_handles, uint16_t handle_count)); - - -/**@brief Perform a Write (Characteristic Value or Descriptor, with or without response, signed or not, long or reliable) procedure. - * - * @details This function can perform all write procedures described in GATT. - * - * @note Only one write with response procedure can be ongoing per connection at a time. - * If the application tries to write with response while another write with response procedure is ongoing, - * the function call will return @ref NRF_ERROR_BUSY. - * A @ref BLE_GATTC_EVT_WRITE_RSP event will be issued as soon as the write response arrives from the peer. - * - * @note The number of Write without Response that can be queued is configured by @ref ble_gattc_conn_cfg_t::write_cmd_tx_queue_size - * When the queue is full, the function call will return @ref NRF_ERROR_RESOURCES. - * A @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event will be issued as soon as the transmission of the write without response is complete. - * - * @note The application can keep track of the available queue element count for writes without responses by following the procedure below: - * - Store initial queue element count in a variable. - * - Decrement the variable, which stores the currently available queue element count, by one when a call to this function returns @ref NRF_SUCCESS. - * - Increment the variable, which stores the current available queue element count, by the count variable in @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event. - * - * @events - * @event{@ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE, Write without response transmission complete.} - * @event{@ref BLE_GATTC_EVT_WRITE_RSP, Write response received from the peer.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_VALUE_WRITE_WITHOUT_RESP_MSC} - * @mmsc{@ref BLE_GATTC_VALUE_WRITE_MSC} - * @mmsc{@ref BLE_GATTC_VALUE_LONG_WRITE_MSC} - * @mmsc{@ref BLE_GATTC_VALUE_RELIABLE_WRITE_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_write_params A pointer to a write parameters structure. - * - * @retval ::NRF_SUCCESS Successfully started the Write procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - * @retval ::NRF_ERROR_BUSY For write with response, procedure already in progress. Wait for a @ref BLE_GATTC_EVT_WRITE_RSP event and retry. - * @retval ::NRF_ERROR_RESOURCES Too many writes without responses queued. - * Wait for a @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event and retry. - */ -SVCALL(SD_BLE_GATTC_WRITE, uint32_t, sd_ble_gattc_write(uint16_t conn_handle, ble_gattc_write_params_t const *p_write_params)); - - -/**@brief Send a Handle Value Confirmation to the GATT Server. - * - * @mscs - * @mmsc{@ref BLE_GATTC_HVI_MSC} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] handle The handle of the attribute in the indication. - * - * @retval ::NRF_SUCCESS Successfully queued the Handle Value Confirmation for transmission. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no Indication pending to be confirmed. - * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle. - */ -SVCALL(SD_BLE_GATTC_HV_CONFIRM, uint32_t, sd_ble_gattc_hv_confirm(uint16_t conn_handle, uint16_t handle)); - -/**@brief Discovers information about a range of attributes on a GATT server. - * - * @events - * @event{@ref BLE_GATTC_EVT_ATTR_INFO_DISC_RSP, Generated when information about a range of attributes has been received.} - * @endevents - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] p_handle_range The range of handles to request information about. - * - * @retval ::NRF_SUCCESS Successfully started an attribute information discovery procedure. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_ATTR_INFO_DISCOVER, uint32_t, sd_ble_gattc_attr_info_discover(uint16_t conn_handle, ble_gattc_handle_range_t const * p_handle_range)); - -/**@brief Start an ATT_MTU exchange by sending an Exchange MTU Request to the server. - * - * @details The SoftDevice sets ATT_MTU to the minimum of: - * - The Client RX MTU value, and - * - The Server RX MTU value from @ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP. - * - * However, the SoftDevice never sets ATT_MTU lower than @ref BLE_GATT_ATT_MTU_DEFAULT. - * - * @events - * @event{@ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTC_MTU_EXCHANGE} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] client_rx_mtu Client RX MTU size. - * - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. - * - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration - used for this connection. - * - The value must be equal to Server RX MTU size given in @ref sd_ble_gatts_exchange_mtu_reply - * if an ATT_MTU exchange has already been performed in the other direction. - * - * @retval ::NRF_SUCCESS Successfully sent request to the server. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state or an ATT_MTU exchange was already requested once. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid Client RX MTU size supplied. - * @retval ::NRF_ERROR_BUSY Client procedure already in progress. - */ -SVCALL(SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, uint32_t, sd_ble_gattc_exchange_mtu_request(uint16_t conn_handle, uint16_t client_rx_mtu)); - -/**@brief Iterate through Handle-Value(s) list in @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP event. - * - * @param[in] p_gattc_evt Pointer to event buffer containing @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP event. - * @note If the buffer contains different event, behavior is undefined. - * @param[in,out] p_iter Iterator, points to @ref ble_gattc_handle_value_t structure that will be filled in with - * the next Handle-Value pair in each iteration. If the function returns other than - * @ref NRF_SUCCESS, it will not be changed. - * - To start iteration, initialize the structure to zero. - * - To continue, pass the value from previous iteration. - * - * \code - * ble_gattc_handle_value_t iter; - * memset(&iter, 0, sizeof(ble_gattc_handle_value_t)); - * while (sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(&ble_evt.evt.gattc_evt, &iter) == NRF_SUCCESS) - * { - * app_handle = iter.handle; - * memcpy(app_value, iter.p_value, ble_evt.evt.gattc_evt.params.char_val_by_uuid_read_rsp.value_len); - * } - * \endcode - * - * @retval ::NRF_SUCCESS Successfully retrieved the next Handle-Value pair. - * @retval ::NRF_ERROR_NOT_FOUND No more Handle-Value pairs available in the list. - */ -__STATIC_INLINE uint32_t sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(ble_gattc_evt_t *p_gattc_evt, ble_gattc_handle_value_t *p_iter); - -/** @} */ - -#ifndef SUPPRESS_INLINE_IMPLEMENTATION - -__STATIC_INLINE uint32_t sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(ble_gattc_evt_t *p_gattc_evt, ble_gattc_handle_value_t *p_iter) -{ - uint32_t value_len = p_gattc_evt->params.char_val_by_uuid_read_rsp.value_len; - uint8_t *p_first = p_gattc_evt->params.char_val_by_uuid_read_rsp.handle_value; - uint8_t *p_next = p_iter->p_value ? p_iter->p_value + value_len : p_first; - - if ((p_next - p_first) / (sizeof(uint16_t) + value_len) < p_gattc_evt->params.char_val_by_uuid_read_rsp.count) - { - p_iter->handle = (uint16_t)p_next[1] << 8 | p_next[0]; - p_iter->p_value = p_next + sizeof(uint16_t); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_NOT_FOUND; - } -} - -#endif /* SUPPRESS_INLINE_IMPLEMENTATION */ - -#ifdef __cplusplus -} -#endif -#endif /* BLE_GATTC_H__ */ - -/** - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gatts.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gatts.h deleted file mode 100644 index 5e8615c05d..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_gatts.h +++ /dev/null @@ -1,835 +0,0 @@ -/* - * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above 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 Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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. - */ - -/** - @addtogroup BLE_GATTS Generic Attribute Profile (GATT) Server - @{ - @brief Definitions and prototypes for the GATTS interface. - */ - -#ifndef BLE_GATTS_H__ -#define BLE_GATTS_H__ - -#include "ble_types.h" -#include "ble_ranges.h" -#include "ble_l2cap.h" -#include "ble_gap.h" -#include "ble_gatt.h" -#include "nrf_svc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_GATTS_ENUMERATIONS Enumerations - * @{ */ - -/** - * @brief GATTS API SVC numbers. - */ -enum BLE_GATTS_SVCS -{ - SD_BLE_GATTS_SERVICE_ADD = BLE_GATTS_SVC_BASE, /**< Add a service. */ - SD_BLE_GATTS_INCLUDE_ADD, /**< Add an included service. */ - SD_BLE_GATTS_CHARACTERISTIC_ADD, /**< Add a characteristic. */ - SD_BLE_GATTS_DESCRIPTOR_ADD, /**< Add a generic attribute. */ - SD_BLE_GATTS_VALUE_SET, /**< Set an attribute value. */ - SD_BLE_GATTS_VALUE_GET, /**< Get an attribute value. */ - SD_BLE_GATTS_HVX, /**< Handle Value Notification or Indication. */ - SD_BLE_GATTS_SERVICE_CHANGED, /**< Perform a Service Changed Indication to one or more peers. */ - SD_BLE_GATTS_RW_AUTHORIZE_REPLY, /**< Reply to an authorization request for a read or write operation on one or more attributes. */ - SD_BLE_GATTS_SYS_ATTR_SET, /**< Set the persistent system attributes for a connection. */ - SD_BLE_GATTS_SYS_ATTR_GET, /**< Retrieve the persistent system attributes. */ - SD_BLE_GATTS_INITIAL_USER_HANDLE_GET, /**< Retrieve the first valid user handle. */ - SD_BLE_GATTS_ATTR_GET, /**< Retrieve the UUID and/or metadata of an attribute. */ - SD_BLE_GATTS_EXCHANGE_MTU_REPLY /**< Reply to Exchange MTU Request. */ -}; - -/** - * @brief GATT Server Event IDs. - */ -enum BLE_GATTS_EVTS -{ - BLE_GATTS_EVT_WRITE = BLE_GATTS_EVT_BASE, /**< Write operation performed. \n See @ref ble_gatts_evt_write_t. */ - BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST, /**< Read/Write Authorization request. \n Reply with @ref sd_ble_gatts_rw_authorize_reply. \n See @ref ble_gatts_evt_rw_authorize_request_t. */ - BLE_GATTS_EVT_SYS_ATTR_MISSING, /**< A persistent system attribute access is pending. \n Respond with @ref sd_ble_gatts_sys_attr_set. \n See @ref ble_gatts_evt_sys_attr_missing_t. */ - BLE_GATTS_EVT_HVC, /**< Handle Value Confirmation. \n See @ref ble_gatts_evt_hvc_t. */ - BLE_GATTS_EVT_SC_CONFIRM, /**< Service Changed Confirmation. \n No additional event structure applies. */ - BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST, /**< Exchange MTU Request. \n Reply with @ref sd_ble_gatts_exchange_mtu_reply. \n See @ref ble_gatts_evt_exchange_mtu_request_t. */ - BLE_GATTS_EVT_TIMEOUT, /**< Peer failed to respond to an ATT request in time. \n See @ref ble_gatts_evt_timeout_t. */ - BLE_GATTS_EVT_HVN_TX_COMPLETE /**< Handle Value Notification transmission complete. \n See @ref ble_gatts_evt_hvn_tx_complete_t. */ -}; - -/**@brief GATTS Configuration IDs. - * - * IDs that uniquely identify a GATTS configuration. - */ -enum BLE_GATTS_CFGS -{ - BLE_GATTS_CFG_SERVICE_CHANGED = BLE_GATTS_CFG_BASE, /**< Service changed configuration. */ - BLE_GATTS_CFG_ATTR_TAB_SIZE, /**< Attribute table size configuration. */ -}; - -/** @} */ - -/** @addtogroup BLE_GATTS_DEFINES Defines - * @{ */ - -/** @defgroup BLE_ERRORS_GATTS SVC return values specific to GATTS - * @{ */ -#define BLE_ERROR_GATTS_INVALID_ATTR_TYPE (NRF_GATTS_ERR_BASE + 0x000) /**< Invalid attribute type. */ -#define BLE_ERROR_GATTS_SYS_ATTR_MISSING (NRF_GATTS_ERR_BASE + 0x001) /**< System Attributes missing. */ -/** @} */ - -/** @defgroup BLE_GATTS_ATTR_LENS_MAX Maximum attribute lengths - * @{ */ -#define BLE_GATTS_FIX_ATTR_LEN_MAX (510) /**< Maximum length for fixed length Attribute Values. */ -#define BLE_GATTS_VAR_ATTR_LEN_MAX (512) /**< Maximum length for variable length Attribute Values. */ -/** @} */ - -/** @defgroup BLE_GATTS_SRVC_TYPES GATT Server Service Types - * @{ */ -#define BLE_GATTS_SRVC_TYPE_INVALID 0x00 /**< Invalid Service Type. */ -#define BLE_GATTS_SRVC_TYPE_PRIMARY 0x01 /**< Primary Service. */ -#define BLE_GATTS_SRVC_TYPE_SECONDARY 0x02 /**< Secondary Type. */ -/** @} */ - - -/** @defgroup BLE_GATTS_ATTR_TYPES GATT Server Attribute Types - * @{ */ -#define BLE_GATTS_ATTR_TYPE_INVALID 0x00 /**< Invalid Attribute Type. */ -#define BLE_GATTS_ATTR_TYPE_PRIM_SRVC_DECL 0x01 /**< Primary Service Declaration. */ -#define BLE_GATTS_ATTR_TYPE_SEC_SRVC_DECL 0x02 /**< Secondary Service Declaration. */ -#define BLE_GATTS_ATTR_TYPE_INC_DECL 0x03 /**< Include Declaration. */ -#define BLE_GATTS_ATTR_TYPE_CHAR_DECL 0x04 /**< Characteristic Declaration. */ -#define BLE_GATTS_ATTR_TYPE_CHAR_VAL 0x05 /**< Characteristic Value. */ -#define BLE_GATTS_ATTR_TYPE_DESC 0x06 /**< Descriptor. */ -#define BLE_GATTS_ATTR_TYPE_OTHER 0x07 /**< Other, non-GATT specific type. */ -/** @} */ - - -/** @defgroup BLE_GATTS_OPS GATT Server Operations - * @{ */ -#define BLE_GATTS_OP_INVALID 0x00 /**< Invalid Operation. */ -#define BLE_GATTS_OP_WRITE_REQ 0x01 /**< Write Request. */ -#define BLE_GATTS_OP_WRITE_CMD 0x02 /**< Write Command. */ -#define BLE_GATTS_OP_SIGN_WRITE_CMD 0x03 /**< Signed Write Command. */ -#define BLE_GATTS_OP_PREP_WRITE_REQ 0x04 /**< Prepare Write Request. */ -#define BLE_GATTS_OP_EXEC_WRITE_REQ_CANCEL 0x05 /**< Execute Write Request: Cancel all prepared writes. */ -#define BLE_GATTS_OP_EXEC_WRITE_REQ_NOW 0x06 /**< Execute Write Request: Immediately execute all prepared writes. */ -/** @} */ - -/** @defgroup BLE_GATTS_VLOCS GATT Value Locations - * @{ */ -#define BLE_GATTS_VLOC_INVALID 0x00 /**< Invalid Location. */ -#define BLE_GATTS_VLOC_STACK 0x01 /**< Attribute Value is located in stack memory, no user memory is required. */ -#define BLE_GATTS_VLOC_USER 0x02 /**< Attribute Value is located in user memory. This requires the user to maintain a valid buffer through the lifetime of the attribute, since the stack - will read and write directly to the memory using the pointer provided in the APIs. There are no alignment requirements for the buffer. */ -/** @} */ - -/** @defgroup BLE_GATTS_AUTHORIZE_TYPES GATT Server Authorization Types - * @{ */ -#define BLE_GATTS_AUTHORIZE_TYPE_INVALID 0x00 /**< Invalid Type. */ -#define BLE_GATTS_AUTHORIZE_TYPE_READ 0x01 /**< Authorize a Read Operation. */ -#define BLE_GATTS_AUTHORIZE_TYPE_WRITE 0x02 /**< Authorize a Write Request Operation. */ -/** @} */ - -/** @defgroup BLE_GATTS_SYS_ATTR_FLAGS System Attribute Flags - * @{ */ -#define BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS (1 << 0) /**< Restrict system attributes to system services only. */ -#define BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS (1 << 1) /**< Restrict system attributes to user services only. */ -/** @} */ - -/** @defgroup BLE_GATTS_SERVICE_CHANGED Service Changed Inclusion Values - * @{ - */ -#define BLE_GATTS_SERVICE_CHANGED_DEFAULT (1) /**< Default is to include the Service Changed characteristic in the Attribute Table. */ -/** @} */ - -/** @defgroup BLE_GATTS_ATTR_TAB_SIZE Attribute Table size - * @{ - */ -#define BLE_GATTS_ATTR_TAB_SIZE_MIN (248) /**< Minimum Attribute Table size */ -#define BLE_GATTS_ATTR_TAB_SIZE_DEFAULT (1408) /**< Default Attribute Table size. */ -/** @} */ - -/** @defgroup BLE_GATTS_DEFAULTS GATT Server defaults - * @{ - */ -#define BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT 1 /**< Default number of Handle Value Notifications that can be queued for transmission. */ -/** @} */ - -/** @} */ - -/** @addtogroup BLE_GATTS_STRUCTURES Structures - * @{ */ - -/** - * @brief BLE GATTS connection configuration parameters, set with @ref sd_ble_cfg_set. - */ -typedef struct -{ - uint8_t hvn_tx_queue_size; /**< Minimum guaranteed number of Handle Value Notifications that can be queued for transmission. - The default value is @ref BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT */ -} ble_gatts_conn_cfg_t; - -/**@brief Attribute metadata. */ -typedef struct -{ - ble_gap_conn_sec_mode_t read_perm; /**< Read permissions. */ - ble_gap_conn_sec_mode_t write_perm; /**< Write permissions. */ - uint8_t vlen :1; /**< Variable length attribute. */ - uint8_t vloc :2; /**< Value location, see @ref BLE_GATTS_VLOCS.*/ - uint8_t rd_auth :1; /**< Read authorization and value will be requested from the application on every read operation. */ - uint8_t wr_auth :1; /**< Write authorization will be requested from the application on every Write Request operation (but not Write Command). */ -} ble_gatts_attr_md_t; - - -/**@brief GATT Attribute. */ -typedef struct -{ - ble_uuid_t const *p_uuid; /**< Pointer to the attribute UUID. */ - ble_gatts_attr_md_t const *p_attr_md; /**< Pointer to the attribute metadata structure. */ - uint16_t init_len; /**< Initial attribute value length in bytes. */ - uint16_t init_offs; /**< Initial attribute value offset in bytes. If different from zero, the first init_offs bytes of the attribute value will be left uninitialized. */ - uint16_t max_len; /**< Maximum attribute value length in bytes, see @ref BLE_GATTS_ATTR_LENS_MAX for maximum values. */ - uint8_t *p_value; /**< Pointer to the attribute data. Please note that if the @ref BLE_GATTS_VLOC_USER value location is selected in the attribute metadata, this will have to point to a buffer - that remains valid through the lifetime of the attribute. This excludes usage of automatic variables that may go out of scope or any other temporary location. - The stack may access that memory directly without the application's knowledge. For writable characteristics, this value must not be a location in flash memory.*/ -} ble_gatts_attr_t; - -/**@brief GATT Attribute Value. */ -typedef struct -{ - uint16_t len; /**< Length in bytes to be written or read. Length in bytes written or read after successful return.*/ - uint16_t offset; /**< Attribute value offset. */ - uint8_t *p_value; /**< Pointer to where value is stored or will be stored. - If value is stored in user memory, only the attribute length is updated when p_value == NULL. - Set to NULL when reading to obtain the complete length of the attribute value */ -} ble_gatts_value_t; - - -/**@brief GATT Characteristic Presentation Format. */ -typedef struct -{ - uint8_t format; /**< Format of the value, see @ref BLE_GATT_CPF_FORMATS. */ - int8_t exponent; /**< Exponent for integer data types. */ - uint16_t unit; /**< Unit from Bluetooth Assigned Numbers. */ - uint8_t name_space; /**< Namespace from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */ - uint16_t desc; /**< Namespace description from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */ -} ble_gatts_char_pf_t; - - -/**@brief GATT Characteristic metadata. */ -typedef struct -{ - ble_gatt_char_props_t char_props; /**< Characteristic Properties. */ - ble_gatt_char_ext_props_t char_ext_props; /**< Characteristic Extended Properties. */ - uint8_t const *p_char_user_desc; /**< Pointer to a UTF-8 encoded string (non-NULL terminated), NULL if the descriptor is not required. */ - uint16_t char_user_desc_max_size; /**< The maximum size in bytes of the user description descriptor. */ - uint16_t char_user_desc_size; /**< The size of the user description, must be smaller or equal to char_user_desc_max_size. */ - ble_gatts_char_pf_t const *p_char_pf; /**< Pointer to a presentation format structure or NULL if the CPF descriptor is not required. */ - ble_gatts_attr_md_t const *p_user_desc_md; /**< Attribute metadata for the User Description descriptor, or NULL for default values. */ - ble_gatts_attr_md_t const *p_cccd_md; /**< Attribute metadata for the Client Characteristic Configuration Descriptor, or NULL for default values. */ - ble_gatts_attr_md_t const *p_sccd_md; /**< Attribute metadata for the Server Characteristic Configuration Descriptor, or NULL for default values. */ -} ble_gatts_char_md_t; - - -/**@brief GATT Characteristic Definition Handles. */ -typedef struct -{ - uint16_t value_handle; /**< Handle to the characteristic value. */ - uint16_t user_desc_handle; /**< Handle to the User Description descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ - uint16_t cccd_handle; /**< Handle to the Client Characteristic Configuration Descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ - uint16_t sccd_handle; /**< Handle to the Server Characteristic Configuration Descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */ -} ble_gatts_char_handles_t; - - -/**@brief GATT HVx parameters. */ -typedef struct -{ - uint16_t handle; /**< Characteristic Value Handle. */ - uint8_t type; /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */ - uint16_t offset; /**< Offset within the attribute value. */ - uint16_t *p_len; /**< Length in bytes to be written, length in bytes written after successful return. */ - uint8_t const *p_data; /**< Actual data content, use NULL to use the current attribute value. */ -} ble_gatts_hvx_params_t; - -/**@brief GATT Authorization parameters. */ -typedef struct -{ - uint16_t gatt_status; /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */ - uint8_t update : 1; /**< If set, data supplied in p_data will be used to update the attribute value. - Please note that for @ref BLE_GATTS_AUTHORIZE_TYPE_WRITE operations this bit must always be set, - as the data to be written needs to be stored and later provided by the application. */ - uint16_t offset; /**< Offset of the attribute value being updated. */ - uint16_t len; /**< Length in bytes of the value in p_data pointer, see @ref BLE_GATTS_ATTR_LENS_MAX. */ - uint8_t const *p_data; /**< Pointer to new value used to update the attribute value. */ -} ble_gatts_authorize_params_t; - -/**@brief GATT Read or Write Authorize Reply parameters. */ -typedef struct -{ - uint8_t type; /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */ - union { - ble_gatts_authorize_params_t read; /**< Read authorization parameters. */ - ble_gatts_authorize_params_t write; /**< Write authorization parameters. */ - } params; /**< Reply Parameters. */ -} ble_gatts_rw_authorize_reply_params_t; - -/**@brief Service Changed Inclusion configuration parameters, set with @ref sd_ble_cfg_set. */ -typedef struct -{ - uint8_t service_changed : 1; /**< If 1, include the Service Changed characteristic in the Attribute Table. Default is @ref BLE_GATTS_SERVICE_CHANGED_DEFAULT. */ -} ble_gatts_cfg_service_changed_t; - -/**@brief Attribute table size configuration parameters, set with @ref sd_ble_cfg_set. - * - * @retval ::NRF_ERROR_INVALID_LENGTH One or more of the following is true: - * - The specified Attribute Table size is too small. - * The minimum acceptable size is defined by @ref BLE_GATTS_ATTR_TAB_SIZE_MIN. - * - The specified Attribute Table size is not a multiple of 4. - */ -typedef struct -{ - uint32_t attr_tab_size; /**< Attribute table size. Default is @ref BLE_GATTS_ATTR_TAB_SIZE_DEFAULT, minimum is @ref BLE_GATTS_ATTR_TAB_SIZE_MIN. */ -} ble_gatts_cfg_attr_tab_size_t; - -/**@brief Config structure for GATTS configurations. */ -typedef union -{ - ble_gatts_cfg_service_changed_t service_changed; /**< Include service changed characteristic, cfg_id is @ref BLE_GATTS_CFG_SERVICE_CHANGED. */ - ble_gatts_cfg_attr_tab_size_t attr_tab_size; /**< Attribute table size, cfg_id is @ref BLE_GATTS_CFG_ATTR_TAB_SIZE. */ -} ble_gatts_cfg_t; - - -/**@brief Event structure for @ref BLE_GATTS_EVT_WRITE. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - ble_uuid_t uuid; /**< Attribute UUID. */ - uint8_t op; /**< Type of write operation, see @ref BLE_GATTS_OPS. */ - uint8_t auth_required; /**< Writing operation deferred due to authorization requirement. Application may use @ref sd_ble_gatts_value_set to finalize the writing operation. */ - uint16_t offset; /**< Offset for the write operation. */ - uint16_t len; /**< Length of the received data. */ - uint8_t data[1]; /**< Received data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation. - See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */ -} ble_gatts_evt_write_t; - -/**@brief Event substructure for authorized read requests, see @ref ble_gatts_evt_rw_authorize_request_t. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ - ble_uuid_t uuid; /**< Attribute UUID. */ - uint16_t offset; /**< Offset for the read operation. */ -} ble_gatts_evt_read_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST. */ -typedef struct -{ - uint8_t type; /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */ - union { - ble_gatts_evt_read_t read; /**< Attribute Read Parameters. */ - ble_gatts_evt_write_t write; /**< Attribute Write Parameters. */ - } request; /**< Request Parameters. */ -} ble_gatts_evt_rw_authorize_request_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_SYS_ATTR_MISSING. */ -typedef struct -{ - uint8_t hint; /**< Hint (currently unused). */ -} ble_gatts_evt_sys_attr_missing_t; - - -/**@brief Event structure for @ref BLE_GATTS_EVT_HVC. */ -typedef struct -{ - uint16_t handle; /**< Attribute Handle. */ -} ble_gatts_evt_hvc_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST. */ -typedef struct -{ - uint16_t client_rx_mtu; /**< Client RX MTU size. */ -} ble_gatts_evt_exchange_mtu_request_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_TIMEOUT. */ -typedef struct -{ - uint8_t src; /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */ -} ble_gatts_evt_timeout_t; - -/**@brief Event structure for @ref BLE_GATTS_EVT_HVN_TX_COMPLETE. */ -typedef struct -{ - uint8_t count; /**< Number of notification transmissions completed. */ -} ble_gatts_evt_hvn_tx_complete_t; - -/**@brief GATTS event structure. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which the event occurred. */ - union - { - ble_gatts_evt_write_t write; /**< Write Event Parameters. */ - ble_gatts_evt_rw_authorize_request_t authorize_request; /**< Read or Write Authorize Request Parameters. */ - ble_gatts_evt_sys_attr_missing_t sys_attr_missing; /**< System attributes missing. */ - ble_gatts_evt_hvc_t hvc; /**< Handle Value Confirmation Event Parameters. */ - ble_gatts_evt_exchange_mtu_request_t exchange_mtu_request; /**< Exchange MTU Request Event Parameters. */ - ble_gatts_evt_timeout_t timeout; /**< Timeout Event. */ - ble_gatts_evt_hvn_tx_complete_t hvn_tx_complete; /**< Handle Value Notification transmission complete Event Parameters. */ - } params; /**< Event Parameters. */ -} ble_gatts_evt_t; - -/** @} */ - -/** @addtogroup BLE_GATTS_FUNCTIONS Functions - * @{ */ - -/**@brief Add a service declaration to the Attribute Table. - * - * @note Secondary Services are only relevant in the context of the entity that references them, it is therefore forbidden to - * add a secondary service declaration that is not referenced by another service later in the Attribute Table. - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] type Toggles between primary and secondary services, see @ref BLE_GATTS_SRVC_TYPES. - * @param[in] p_uuid Pointer to service UUID. - * @param[out] p_handle Pointer to a 16-bit word where the assigned handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully added a service declaration. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, Vendor Specific UUIDs need to be present in the table. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - */ -SVCALL(SD_BLE_GATTS_SERVICE_ADD, uint32_t, sd_ble_gatts_service_add(uint8_t type, ble_uuid_t const *p_uuid, uint16_t *p_handle)); - - -/**@brief Add an include declaration to the Attribute Table. - * - * @note It is currently only possible to add an include declaration to the last added service (i.e. only sequential population is supported at this time). - * - * @note The included service must already be present in the Attribute Table prior to this call. - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] service_handle Handle of the service where the included service is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. - * @param[in] inc_srvc_handle Handle of the included service. - * @param[out] p_include_handle Pointer to a 16-bit word where the assigned handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully added an include declaration. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, handle values need to match previously added services. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. - * @retval ::NRF_ERROR_NOT_SUPPORTED Feature is not supported, service_handle must be that of the last added service. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, self inclusions are not allowed. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - */ -SVCALL(SD_BLE_GATTS_INCLUDE_ADD, uint32_t, sd_ble_gatts_include_add(uint16_t service_handle, uint16_t inc_srvc_handle, uint16_t *p_include_handle)); - - -/**@brief Add a characteristic declaration, a characteristic value declaration and optional characteristic descriptor declarations to the Attribute Table. - * - * @note It is currently only possible to add a characteristic to the last added service (i.e. only sequential population is supported at this time). - * - * @note Several restrictions apply to the parameters, such as matching permissions between the user description descriptor and the writable auxiliaries bits, - * readable (no security) and writable (selectable) CCCDs and SCCDs and valid presentation format values. - * - * @note If no metadata is provided for the optional descriptors, their permissions will be derived from the characteristic permissions. - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] service_handle Handle of the service where the characteristic is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. - * @param[in] p_char_md Characteristic metadata. - * @param[in] p_attr_char_value Pointer to the attribute structure corresponding to the characteristic value. - * @param[out] p_handles Pointer to the structure where the assigned handles will be stored. - * - * @retval ::NRF_SUCCESS Successfully added a characteristic. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, service handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a service context is required. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. - */ -SVCALL(SD_BLE_GATTS_CHARACTERISTIC_ADD, uint32_t, sd_ble_gatts_characteristic_add(uint16_t service_handle, ble_gatts_char_md_t const *p_char_md, ble_gatts_attr_t const *p_attr_char_value, ble_gatts_char_handles_t *p_handles)); - - -/**@brief Add a descriptor to the Attribute Table. - * - * @note It is currently only possible to add a descriptor to the last added characteristic (i.e. only sequential population is supported at this time). - * - * @mscs - * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC} - * @endmscs - * - * @param[in] char_handle Handle of the characteristic where the descriptor is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially. - * @param[in] p_attr Pointer to the attribute structure. - * @param[out] p_handle Pointer to a 16-bit word where the assigned handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully added a descriptor. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, characteristic handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints. - * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a characteristic context is required. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. - */ -SVCALL(SD_BLE_GATTS_DESCRIPTOR_ADD, uint32_t, sd_ble_gatts_descriptor_add(uint16_t char_handle, ble_gatts_attr_t const *p_attr, uint16_t *p_handle)); - -/**@brief Set the value of a given attribute. - * - * @note Values other than system attributes can be set at any time, regardless of whether any active connections exist. - * - * @mscs - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. Ignored if the value does not belong to a system attribute. - * @param[in] handle Attribute handle. - * @param[in,out] p_value Attribute value information. - * - * @retval ::NRF_SUCCESS Successfully set the value of the attribute. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - * @retval ::NRF_ERROR_FORBIDDEN Forbidden handle supplied, certain attributes are not modifiable by the application. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied on a system attribute. - */ -SVCALL(SD_BLE_GATTS_VALUE_SET, uint32_t, sd_ble_gatts_value_set(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value)); - -/**@brief Get the value of a given attribute. - * - * @note If the attribute value is longer than the size of the supplied buffer, - * p_len will return the total attribute value length (excluding offset), - * and not the number of bytes actually returned in p_data. - * The application may use this information to allocate a suitable buffer size. - * - * @note When retrieving system attribute values with this function, the connection handle - * may refer to an already disconnected connection. Refer to the documentation of - * @ref sd_ble_gatts_sys_attr_get for further information. - * - * @param[in] conn_handle Connection handle. Ignored if the value does not belong to a system attribute. - * @param[in] handle Attribute handle. - * @param[in,out] p_value Attribute value information. - * - * @retval ::NRF_SUCCESS Successfully retrieved the value of the attribute. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid attribute offset supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied on a system attribute. - * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. - */ -SVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value)); - -/**@brief Notify or Indicate an attribute value. - * - * @details This function checks for the relevant Client Characteristic Configuration descriptor value to verify that the relevant operation - * (notification or indication) has been enabled by the client. It is also able to update the attribute value before issuing the PDU, so that - * the application can atomically perform a value update and a server initiated transaction with a single API call. - * - * @note The local attribute value may be updated even if an outgoing packet is not sent to the peer due to an error during execution. - * The Attribute Table has been updated if one of the following error codes is returned: @ref NRF_ERROR_INVALID_STATE, @ref NRF_ERROR_BUSY, - * @ref NRF_ERROR_FORBIDDEN, @ref BLE_ERROR_GATTS_SYS_ATTR_MISSING and @ref NRF_ERROR_RESOURCES. - * The caller can check whether the value has been updated by looking at the contents of *(p_hvx_params->p_len). - * - * @note Only one indication procedure can be ongoing per connection at a time. - * If the application tries to indicate an attribute value while another indication procedure is ongoing, - * the function call will return @ref NRF_ERROR_BUSY. - * A @ref BLE_GATTS_EVT_HVC event will be issued as soon as the confirmation arrives from the peer. - * - * @note The number of Handle Value Notifications that can be queued is configured by @ref ble_gatts_conn_cfg_t::hvn_tx_queue_size - * When the queue is full, the function call will return @ref NRF_ERROR_RESOURCES. - * A @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event will be issued as soon as the transmission of the notification is complete. - * - * @note The application can keep track of the available queue element count for notifications by following the procedure below: - * - Store initial queue element count in a variable. - * - Decrement the variable, which stores the currently available queue element count, by one when a call to this function returns @ref NRF_SUCCESS. - * - Increment the variable, which stores the current available queue element count, by the count variable in @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event. - * - * @events - * @event{@ref BLE_GATTS_EVT_HVN_TX_COMPLETE, Notification transmission complete.} - * @event{@ref BLE_GATTS_EVT_HVC, Confirmation received from the peer.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTS_HVX_SYS_ATTRS_MISSING_MSC} - * @mmsc{@ref BLE_GATTS_HVN_MSC} - * @mmsc{@ref BLE_GATTS_HVI_MSC} - * @mmsc{@ref BLE_GATTS_HVX_DISABLED_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_hvx_params Pointer to an HVx parameters structure. If the p_data member contains a non-NULL pointer the attribute value will be updated with - * the contents pointed by it before sending the notification or indication. - * - * @retval ::NRF_SUCCESS Successfully queued a notification or indication for transmission, and optionally updated the attribute value. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE One or more of the following is true: - * - Invalid Connection State - * - Notifications and/or indications not enabled in the CCCD - * - An ATT_MTU exchange is ongoing - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied. Only attributes added directly by the application are available to notify and indicate. - * @retval ::BLE_ERROR_GATTS_INVALID_ATTR_TYPE Invalid attribute type(s) supplied, only characteristic values may be notified and indicated. - * @retval ::NRF_ERROR_NOT_FOUND Attribute not found. - * @retval ::NRF_ERROR_FORBIDDEN The connection's current security level is lower than the one required by the write permissions of the CCCD associated with this characteristic. - * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied. - * @retval ::NRF_ERROR_BUSY For @ref BLE_GATT_HVX_INDICATION Procedure already in progress. Wait for a @ref BLE_GATTS_EVT_HVC event and retry. - * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. - * @retval ::NRF_ERROR_RESOURCES Too many notifications queued. - * Wait for a @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event and retry. - */ -SVCALL(SD_BLE_GATTS_HVX, uint32_t, sd_ble_gatts_hvx(uint16_t conn_handle, ble_gatts_hvx_params_t const *p_hvx_params)); - -/**@brief Indicate the Service Changed attribute value. - * - * @details This call will send a Handle Value Indication to one or more peers connected to inform them that the Attribute - * Table layout has changed. As soon as the peer has confirmed the indication, a @ref BLE_GATTS_EVT_SC_CONFIRM event will - * be issued. - * - * @note Some of the restrictions and limitations that apply to @ref sd_ble_gatts_hvx also apply here. - * - * @events - * @event{@ref BLE_GATTS_EVT_SC_CONFIRM, Confirmation of attribute table change received from peer.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_GATTS_SC_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] start_handle Start of affected attribute handle range. - * @param[in] end_handle End of affected attribute handle range. - * - * @retval ::NRF_SUCCESS Successfully queued the Service Changed indication for transmission. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_NOT_SUPPORTED Service Changed not enabled at initialization. See @ref - * sd_ble_cfg_set and @ref ble_gatts_cfg_service_changed_t. - * @retval ::NRF_ERROR_INVALID_STATE One or more of the following is true: - * - Invalid Connection State - * - Notifications and/or indications not enabled in the CCCD - * - An ATT_MTU exchange is ongoing - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied, handles must be in the range populated by the application. - * @retval ::NRF_ERROR_BUSY Procedure already in progress. - * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value. - */ -SVCALL(SD_BLE_GATTS_SERVICE_CHANGED, uint32_t, sd_ble_gatts_service_changed(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle)); - -/**@brief Respond to a Read/Write authorization request. - * - * @note This call should only be used as a response to a @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event issued to the application. - * - * @mscs - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC} - * @mmsc{@ref BLE_GATTS_READ_REQ_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_WRITE_REQ_AUTH_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC} - * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_rw_authorize_reply_params Pointer to a structure with the attribute provided by the application. - * - * @note @ref ble_gatts_authorize_params_t::p_data is ignored when this function is used to respond - * to a @ref BLE_GATTS_AUTHORIZE_TYPE_READ event if @ref ble_gatts_authorize_params_t::update - * is set to 0. - * - * @retval ::NRF_SUCCESS Successfully queued a response to the peer, and in the case of a write operation, Attribute Table updated. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no authorization request pending. - * @retval ::NRF_ERROR_INVALID_PARAM Authorization op invalid, - * handle supplied does not match requested handle, - * or invalid data to be written provided by the application. - */ -SVCALL(SD_BLE_GATTS_RW_AUTHORIZE_REPLY, uint32_t, sd_ble_gatts_rw_authorize_reply(uint16_t conn_handle, ble_gatts_rw_authorize_reply_params_t const *p_rw_authorize_reply_params)); - - -/**@brief Update persistent system attribute information. - * - * @details Supply information about persistent system attributes to the stack, - * previously obtained using @ref sd_ble_gatts_sys_attr_get. - * This call is only allowed for active connections, and is usually - * made immediately after a connection is established with an known bonded device, - * often as a response to a @ref BLE_GATTS_EVT_SYS_ATTR_MISSING. - * - * p_sysattrs may point directly to the application's stored copy of the system attributes - * obtained using @ref sd_ble_gatts_sys_attr_get. - * If the pointer is NULL, the system attribute info is initialized, assuming that - * the application does not have any previously saved system attribute data for this device. - * - * @note The state of persistent system attributes is reset upon connection establishment and then remembered for its duration. - * - * @note If this call returns with an error code different from @ref NRF_SUCCESS, the storage of persistent system attributes may have been completed only partially. - * This means that the state of the attribute table is undefined, and the application should either provide a new set of attributes using this same call or - * reset the SoftDevice to return to a known state. - * - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS is used with this function, only the system attributes included in system services will be modified. - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS is used with this function, only the system attributes included in user services will be modified. - * - * @mscs - * @mmsc{@ref BLE_GATTS_HVX_SYS_ATTRS_MISSING_MSC} - * @mmsc{@ref BLE_GATTS_SYS_ATTRS_UNK_PEER_MSC} - * @mmsc{@ref BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle. - * @param[in] p_sys_attr_data Pointer to a saved copy of system attributes supplied to the stack, or NULL. - * @param[in] len Size of data pointed by p_sys_attr_data, in octets. - * @param[in] flags Optional additional flags, see @ref BLE_GATTS_SYS_ATTR_FLAGS - * - * @retval ::NRF_SUCCESS Successfully set the system attribute information. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid flags supplied. - * @retval ::NRF_ERROR_INVALID_DATA Invalid data supplied, the data should be exactly the same as retrieved with @ref sd_ble_gatts_sys_attr_get. - * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation. - */ -SVCALL(SD_BLE_GATTS_SYS_ATTR_SET, uint32_t, sd_ble_gatts_sys_attr_set(uint16_t conn_handle, uint8_t const *p_sys_attr_data, uint16_t len, uint32_t flags)); - - -/**@brief Retrieve persistent system attribute information from the stack. - * - * @details This call is used to retrieve information about values to be stored persistently by the application - * during the lifetime of a connection or after it has been terminated. When a new connection is established with the same bonded device, - * the system attribute information retrieved with this function should be restored using using @ref sd_ble_gatts_sys_attr_set. - * If retrieved after disconnection, the data should be read before a new connection established. The connection handle for - * the previous, now disconnected, connection will remain valid until a new one is created to allow this API call to refer to it. - * Connection handles belonging to active connections can be used as well, but care should be taken since the system attributes - * may be written to at any time by the peer during a connection's lifetime. - * - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS is used with this function, only the system attributes included in system services will be returned. - * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS is used with this function, only the system attributes included in user services will be returned. - * - * @mscs - * @mmsc{@ref BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC} - * @endmscs - * - * @param[in] conn_handle Connection handle of the recently terminated connection. - * @param[out] p_sys_attr_data Pointer to a buffer where updated information about system attributes will be filled in. The format of the data is described - * in @ref BLE_GATTS_SYS_ATTRS_FORMAT. NULL can be provided to obtain the length of the data. - * @param[in,out] p_len Size of application buffer if p_sys_attr_data is not NULL. Unconditionally updated to actual length of system attribute data. - * @param[in] flags Optional additional flags, see @ref BLE_GATTS_SYS_ATTR_FLAGS - * - * @retval ::NRF_SUCCESS Successfully retrieved the system attribute information. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid flags supplied. - * @retval ::NRF_ERROR_DATA_SIZE The system attribute information did not fit into the provided buffer. - * @retval ::NRF_ERROR_NOT_FOUND No system attributes found. - */ -SVCALL(SD_BLE_GATTS_SYS_ATTR_GET, uint32_t, sd_ble_gatts_sys_attr_get(uint16_t conn_handle, uint8_t *p_sys_attr_data, uint16_t *p_len, uint32_t flags)); - - -/**@brief Retrieve the first valid user attribute handle. - * - * @param[out] p_handle Pointer to an integer where the handle will be stored. - * - * @retval ::NRF_SUCCESS Successfully retrieved the handle. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - */ -SVCALL(SD_BLE_GATTS_INITIAL_USER_HANDLE_GET, uint32_t, sd_ble_gatts_initial_user_handle_get(uint16_t *p_handle)); - -/**@brief Retrieve the attribute UUID and/or metadata. - * - * @param[in] handle Attribute handle - * @param[out] p_uuid UUID of the attribute. Use NULL to omit this field. - * @param[out] p_md Metadata of the attribute. Use NULL to omit this field. - * - * @retval ::NRF_SUCCESS Successfully retrieved the attribute metadata, - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied. Returned when both @c p_uuid and @c p_md are NULL. - * @retval ::NRF_ERROR_NOT_FOUND Attribute was not found. - */ -SVCALL(SD_BLE_GATTS_ATTR_GET, uint32_t, sd_ble_gatts_attr_get(uint16_t handle, ble_uuid_t * p_uuid, ble_gatts_attr_md_t * p_md)); - -/**@brief Reply to an ATT_MTU exchange request by sending an Exchange MTU Response to the client. - * - * @details This function is only used to reply to a @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST event. - * - * @details The SoftDevice sets ATT_MTU to the minimum of: - * - The Client RX MTU value from @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST, and - * - The Server RX MTU value. - * - * However, the SoftDevice never sets ATT_MTU lower than @ref BLE_GATT_ATT_MTU_DEFAULT. - * - * @mscs - * @mmsc{@ref BLE_GATTS_MTU_EXCHANGE} - * @endmscs - * - * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on. - * @param[in] server_rx_mtu Server RX MTU size. - * - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT. - * - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration - used for this connection. - * - The value must be equal to Client RX MTU size given in @ref sd_ble_gattc_exchange_mtu_request - * if an ATT_MTU exchange has already been performed in the other direction. - * - * @retval ::NRF_SUCCESS Successfully sent response to the client. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no ATT_MTU exchange request pending. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid Server RX MTU size supplied. - */ -SVCALL(SD_BLE_GATTS_EXCHANGE_MTU_REPLY, uint32_t, sd_ble_gatts_exchange_mtu_reply(uint16_t conn_handle, uint16_t server_rx_mtu)); -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // BLE_GATTS_H__ - -/** - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_hci.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_hci.h deleted file mode 100644 index f0dde9a03a..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_hci.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above 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 Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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. - */ - -/** - @addtogroup BLE_COMMON - @{ -*/ - - -#ifndef BLE_HCI_H__ -#define BLE_HCI_H__ -#ifdef __cplusplus -extern "C" { -#endif - -/** @defgroup BLE_HCI_STATUS_CODES Bluetooth status codes - * @{ */ - -#define BLE_HCI_STATUS_CODE_SUCCESS 0x00 /**< Success. */ -#define BLE_HCI_STATUS_CODE_UNKNOWN_BTLE_COMMAND 0x01 /**< Unknown BLE Command. */ -#define BLE_HCI_STATUS_CODE_UNKNOWN_CONNECTION_IDENTIFIER 0x02 /**< Unknown Connection Identifier. */ -/*0x03 Hardware Failure -0x04 Page Timeout -*/ -#define BLE_HCI_AUTHENTICATION_FAILURE 0x05 /**< Authentication Failure. */ -#define BLE_HCI_STATUS_CODE_PIN_OR_KEY_MISSING 0x06 /**< Pin or Key missing. */ -#define BLE_HCI_MEMORY_CAPACITY_EXCEEDED 0x07 /**< Memory Capacity Exceeded. */ -#define BLE_HCI_CONNECTION_TIMEOUT 0x08 /**< Connection Timeout. */ -/*0x09 Connection Limit Exceeded -0x0A Synchronous Connection Limit To A Device Exceeded -0x0B ACL Connection Already Exists*/ -#define BLE_HCI_STATUS_CODE_COMMAND_DISALLOWED 0x0C /**< Command Disallowed. */ -/*0x0D Connection Rejected due to Limited Resources -0x0E Connection Rejected Due To Security Reasons -0x0F Connection Rejected due to Unacceptable BD_ADDR -0x10 Connection Accept Timeout Exceeded -0x11 Unsupported Feature or Parameter Value*/ -#define BLE_HCI_STATUS_CODE_INVALID_BTLE_COMMAND_PARAMETERS 0x12 /**< Invalid BLE Command Parameters. */ -#define BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION 0x13 /**< Remote User Terminated Connection. */ -#define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES 0x14 /**< Remote Device Terminated Connection due to low resources.*/ -#define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF 0x15 /**< Remote Device Terminated Connection due to power off. */ -#define BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION 0x16 /**< Local Host Terminated Connection. */ -/* -0x17 Repeated Attempts -0x18 Pairing Not Allowed -0x19 Unknown LMP PDU -*/ -#define BLE_HCI_UNSUPPORTED_REMOTE_FEATURE 0x1A /**< Unsupported Remote Feature. */ -/* -0x1B SCO Offset Rejected -0x1C SCO Interval Rejected -0x1D SCO Air Mode Rejected*/ -#define BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS 0x1E /**< Invalid LMP Parameters. */ -#define BLE_HCI_STATUS_CODE_UNSPECIFIED_ERROR 0x1F /**< Unspecified Error. */ -/*0x20 Unsupported LMP Parameter Value -0x21 Role Change Not Allowed -*/ -#define BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT 0x22 /**< LMP Response Timeout. */ -#define BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION 0x23 /**< LMP Error Transaction Collision/LL Procedure Collision. */ -#define BLE_HCI_STATUS_CODE_LMP_PDU_NOT_ALLOWED 0x24 /**< LMP PDU Not Allowed. */ -/*0x25 Encryption Mode Not Acceptable -0x26 Link Key Can Not be Changed -0x27 Requested QoS Not Supported -*/ -#define BLE_HCI_INSTANT_PASSED 0x28 /**< Instant Passed. */ -#define BLE_HCI_PAIRING_WITH_UNIT_KEY_UNSUPPORTED 0x29 /**< Pairing with Unit Key Unsupported. */ -#define BLE_HCI_DIFFERENT_TRANSACTION_COLLISION 0x2A /**< Different Transaction Collision. */ -/* -0x2B Reserved -0x2C QoS Unacceptable Parameter -0x2D QoS Rejected -0x2E Channel Classification Not Supported -0x2F Insufficient Security -*/ -#define BLE_HCI_PARAMETER_OUT_OF_MANDATORY_RANGE 0x30 /**< Parameter Out Of Mandatory Range. */ -/* -0x31 Reserved -0x32 Role Switch Pending -0x33 Reserved -0x34 Reserved Slot Violation -0x35 Role Switch Failed -0x36 Extended Inquiry Response Too Large -0x37 Secure Simple Pairing Not Supported By Host. -0x38 Host Busy - Pairing -0x39 Connection Rejected due to No Suitable Channel Found*/ -#define BLE_HCI_CONTROLLER_BUSY 0x3A /**< Controller Busy. */ -#define BLE_HCI_CONN_INTERVAL_UNACCEPTABLE 0x3B /**< Connection Interval Unacceptable. */ -#define BLE_HCI_DIRECTED_ADVERTISER_TIMEOUT 0x3C /**< Directed Advertisement Timeout. */ -#define BLE_HCI_CONN_TERMINATED_DUE_TO_MIC_FAILURE 0x3D /**< Connection Terminated due to MIC Failure. */ -#define BLE_HCI_CONN_FAILED_TO_BE_ESTABLISHED 0x3E /**< Connection Failed to be Established. */ - -/** @} */ - - -#ifdef __cplusplus -} -#endif -#endif // BLE_HCI_H__ - -/** @} */ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_l2cap.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_l2cap.h deleted file mode 100644 index 3b53ded092..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_l2cap.h +++ /dev/null @@ -1,504 +0,0 @@ -/* - * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above 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 Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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. - */ - -/** - @addtogroup BLE_L2CAP Logical Link Control and Adaptation Protocol (L2CAP) - @{ - @brief Definitions and prototypes for the L2CAP interface. - */ - -#ifndef BLE_L2CAP_H__ -#define BLE_L2CAP_H__ - -#include "ble_types.h" -#include "ble_ranges.h" -#include "ble_err.h" -#include "nrf_svc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup BLE_L2CAP_TERMINOLOGY Terminology - * @{ - * @details - * - * L2CAP SDU - * - A data unit that the application can send/receive to/from a peer. - * - * L2CAP PDU - * - A data unit that is exchanged between local and remote L2CAP entities. - * It consists of L2CAP protocol control information and payload fields. - * The payload field can contain an L2CAP SDU or a part of an L2CAP SDU. - * - * L2CAP MTU - * - The maximum length of an L2CAP SDU. - * - * L2CAP MPS - * - The maximum length of an L2CAP PDU payload field. - * - * Credits - * - A value indicating the number of L2CAP PDUs that the receiver of the credit can send to the peer. - * @} */ - -/**@addtogroup BLE_L2CAP_ENUMERATIONS Enumerations - * @{ */ - -/**@brief L2CAP API SVC numbers. */ -enum BLE_L2CAP_SVCS -{ - SD_BLE_L2CAP_CH_SETUP = BLE_L2CAP_SVC_BASE, /**< Set up an L2CAP channel. */ - SD_BLE_L2CAP_CH_RELEASE, /**< Release an L2CAP channel. */ - SD_BLE_L2CAP_CH_RX, /**< Receive an SDU on an L2CAP channel. */ - SD_BLE_L2CAP_CH_TX, /**< Transmit an SDU on an L2CAP channel. */ - SD_BLE_L2CAP_CH_FLOW_CONTROL, /**< Advanced SDU reception flow control. */ -}; - -/**@brief L2CAP Event IDs. */ -enum BLE_L2CAP_EVTS -{ - BLE_L2CAP_EVT_CH_SETUP_REQUEST = BLE_L2CAP_EVT_BASE, /**< L2CAP Channel Setup Request event. - \n See @ref ble_l2cap_evt_ch_setup_request_t. */ - BLE_L2CAP_EVT_CH_SETUP_REFUSED, /**< L2CAP Channel Setup Refused event. - \n See @ref ble_l2cap_evt_ch_setup_refused_t. */ - BLE_L2CAP_EVT_CH_SETUP, /**< L2CAP Channel Setup Completed event. - \n See @ref ble_l2cap_evt_ch_setup_t. */ - BLE_L2CAP_EVT_CH_RELEASED, /**< L2CAP Channel Released event. - \n No additional event structure applies. */ - BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED, /**< L2CAP Channel SDU data buffer released event. - \n See @ref ble_l2cap_evt_ch_sdu_buf_released_t. */ - BLE_L2CAP_EVT_CH_CREDIT, /**< L2CAP Channel Credit received. - \n See @ref ble_l2cap_evt_ch_credit_t. */ - BLE_L2CAP_EVT_CH_RX, /**< L2CAP Channel SDU received. - \n See @ref ble_l2cap_evt_ch_rx_t. */ - BLE_L2CAP_EVT_CH_TX, /**< L2CAP Channel SDU transmitted. - \n See @ref ble_l2cap_evt_ch_tx_t. */ -}; - -/** @} */ - -/**@addtogroup BLE_L2CAP_DEFINES Defines - * @{ */ - -/**@brief Maximum number of L2CAP channels per connection. */ -#define BLE_L2CAP_CH_COUNT_MAX (64) - -/**@brief Minimum L2CAP MTU, in bytes. */ -#define BLE_L2CAP_MTU_MIN (23) - -/**@brief Minimum L2CAP MPS, in bytes. */ -#define BLE_L2CAP_MPS_MIN (23) - -/**@brief Invalid CID. */ -#define BLE_L2CAP_CID_INVALID (0x0000) - -/**@brief Default number of credits for @ref sd_ble_l2cap_ch_flow_control. */ -#define BLE_L2CAP_CREDITS_DEFAULT (1) - -/**@defgroup BLE_L2CAP_CH_SETUP_REFUSED_SRCS L2CAP channel setup refused sources - * @{ */ -#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_LOCAL (0x01) /**< Local. */ -#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_REMOTE (0x02) /**< Remote. */ - /** @} */ - - /** @defgroup BLE_L2CAP_CH_STATUS_CODES L2CAP channel status codes - * @{ */ -#define BLE_L2CAP_CH_STATUS_CODE_SUCCESS (0x0000) /**< Success. */ -#define BLE_L2CAP_CH_STATUS_CODE_LE_PSM_NOT_SUPPORTED (0x0002) /**< LE_PSM not supported. */ -#define BLE_L2CAP_CH_STATUS_CODE_NO_RESOURCES (0x0004) /**< No resources available. */ -#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHENTICATION (0x0005) /**< Insufficient authentication. */ -#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHORIZATION (0x0006) /**< Insufficient authorization. */ -#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC_KEY_SIZE (0x0007) /**< Insufficient encryption key size. */ -#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC (0x0008) /**< Insufficient encryption. */ -#define BLE_L2CAP_CH_STATUS_CODE_INVALID_SCID (0x0009) /**< Invalid Source CID. */ -#define BLE_L2CAP_CH_STATUS_CODE_SCID_ALLOCATED (0x000A) /**< Source CID already allocated. */ -#define BLE_L2CAP_CH_STATUS_CODE_UNACCEPTABLE_PARAMS (0x000B) /**< Unacceptable parameters. */ -#define BLE_L2CAP_CH_STATUS_CODE_NOT_UNDERSTOOD (0x8000) /**< Command Reject received instead of LE Credit Based Connection Response. */ -#define BLE_L2CAP_CH_STATUS_CODE_TIMEOUT (0xC000) /**< Operation timed out. */ -/** @} */ - -/** @} */ - -/**@addtogroup BLE_L2CAP_STRUCTURES Structures - * @{ */ - -/** - * @brief BLE L2CAP connection configuration parameters, set with @ref sd_ble_cfg_set. - * - * @note These parameters are set per connection, so all L2CAP channels created on this connection - * will have the same parameters. - * - * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true: - * - rx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. - * - tx_mps is smaller than @ref BLE_L2CAP_MPS_MIN. - * - ch_count is greater than @ref BLE_L2CAP_CH_COUNT_MAX. - * @retval ::NRF_ERROR_NO_MEM rx_mps or tx_mps is set too high. - */ -typedef struct -{ - uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall - be able to receive on L2CAP channels on connections with this - configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ - uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall - be able to transmit on L2CAP channels on connections with this - configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */ - uint8_t rx_queue_size; /**< Number of SDU data buffers that can be queued for reception per - L2CAP channel. The minimum value is one. */ - uint8_t tx_queue_size; /**< Number of SDU data buffers that can be queued for transmission - per L2CAP channel. The minimum value is one. */ - uint8_t ch_count; /**< Number of L2CAP channels the application can create per connection - with this configuration. The default value is zero, the maximum - value is @ref BLE_L2CAP_CH_COUNT_MAX. - @note if this parameter is set to zero, all other parameters in - @ref ble_l2cap_conn_cfg_t are ignored. */ -} ble_l2cap_conn_cfg_t; - -/**@brief L2CAP channel RX parameters. */ -typedef struct -{ - uint16_t rx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP shall be able to - receive on this L2CAP channel. - - Must be equal to or greater than @ref BLE_L2CAP_MTU_MIN. */ - uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall be - able to receive on this L2CAP channel. - - Must be equal to or greater than @ref BLE_L2CAP_MPS_MIN. - - Must be equal to or less than @ref ble_l2cap_conn_cfg_t::rx_mps. */ - ble_data_t sdu_buf; /**< SDU data buffer for reception. - - If @ref ble_data_t::p_data is non-NULL, initial credits are - issued to the peer. - - If @ref ble_data_t::p_data is NULL, no initial credits are - issued to the peer. */ -} ble_l2cap_ch_rx_params_t; - -/**@brief L2CAP channel setup parameters. */ -typedef struct -{ - ble_l2cap_ch_rx_params_t rx_params; /**< L2CAP channel RX parameters. */ - uint16_t le_psm; /**< LE Protocol/Service Multiplexer. Used when requesting - setup of an L2CAP channel, ignored otherwise. */ - uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES. - Used when replying to a setup request of an L2CAP - channel, ignored otherwise. */ -} ble_l2cap_ch_setup_params_t; - -/**@brief L2CAP channel TX parameters. */ -typedef struct -{ - uint16_t tx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP is able to - transmit on this L2CAP channel. */ - uint16_t peer_mps; /**< The maximum L2CAP PDU payload size, in bytes, that the peer is - able to receive on this L2CAP channel. */ - uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP is able - to transmit on this L2CAP channel. This is effective tx_mps, - selected by the SoftDevice as - MIN( @ref ble_l2cap_ch_tx_params_t::peer_mps, @ref ble_l2cap_conn_cfg_t::tx_mps ) */ - uint16_t credits; /**< Initial credits given by the peer. */ -} ble_l2cap_ch_tx_params_t; - -/**@brief L2CAP Channel Setup Request event. */ -typedef struct -{ - ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ - uint16_t le_psm; /**< LE Protocol/Service Multiplexer. */ -} ble_l2cap_evt_ch_setup_request_t; - -/**@brief L2CAP Channel Setup Refused event. */ -typedef struct -{ - uint8_t source; /**< Source, see @ref BLE_L2CAP_CH_SETUP_REFUSED_SRCS */ - uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES */ -} ble_l2cap_evt_ch_setup_refused_t; - -/**@brief L2CAP Channel Setup Completed event. */ -typedef struct -{ - ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */ -} ble_l2cap_evt_ch_setup_t; - -/**@brief L2CAP Channel SDU Data Duffer Released event. */ -typedef struct -{ - ble_data_t sdu_buf; /**< Returned reception or transmission SDU data buffer. The SoftDevice - returns SDU data buffers supplied by the application, which have - not yet been returned previously via a @ref BLE_L2CAP_EVT_CH_RX or - @ref BLE_L2CAP_EVT_CH_TX event. */ -} ble_l2cap_evt_ch_sdu_buf_released_t; - -/**@brief L2CAP Channel Credit received event. */ -typedef struct -{ - uint16_t credits; /**< Additional credits given by the peer. */ -} ble_l2cap_evt_ch_credit_t; - -/**@brief L2CAP Channel received SDU event. */ -typedef struct -{ - uint16_t sdu_len; /**< Total SDU length, in bytes. */ - ble_data_t sdu_buf; /**< SDU data buffer. - @note If there is not enough space in the buffer - (sdu_buf.len < sdu_len) then the rest of the SDU will be - silently discarded by the SoftDevice. */ -} ble_l2cap_evt_ch_rx_t; - -/**@brief L2CAP Channel transmitted SDU event. */ -typedef struct -{ - ble_data_t sdu_buf; /**< SDU data buffer. */ -} ble_l2cap_evt_ch_tx_t; - -/**@brief L2CAP event structure. */ -typedef struct -{ - uint16_t conn_handle; /**< Connection Handle on which the event occured. */ - uint16_t local_cid; /**< Local Channel ID of the L2CAP channel, or - @ref BLE_L2CAP_CID_INVALID if not present. */ - union - { - ble_l2cap_evt_ch_setup_request_t ch_setup_request; /**< L2CAP Channel Setup Request Event Parameters. */ - ble_l2cap_evt_ch_setup_refused_t ch_setup_refused; /**< L2CAP Channel Setup Refused Event Parameters. */ - ble_l2cap_evt_ch_setup_t ch_setup; /**< L2CAP Channel Setup Completed Event Parameters. */ - ble_l2cap_evt_ch_sdu_buf_released_t ch_sdu_buf_released;/**< L2CAP Channel SDU Data Buffer Released Event Parameters. */ - ble_l2cap_evt_ch_credit_t credit; /**< L2CAP Channel Credit Received Event Parameters. */ - ble_l2cap_evt_ch_rx_t rx; /**< L2CAP Channel SDU Received Event Parameters. */ - ble_l2cap_evt_ch_tx_t tx; /**< L2CAP Channel SDU Transmitted Event Parameters. */ - } params; /**< Event Parameters. */ -} ble_l2cap_evt_t; - -/** @} */ - -/**@addtogroup BLE_L2CAP_FUNCTIONS Functions - * @{ */ - -/**@brief Set up an L2CAP channel. - * - * @details This function is used to: - * - Request setup of an L2CAP channel: sends an LE Credit Based Connection Request packet to a peer. - * - Reply to a setup request of an L2CAP channel (if called in response to a - * @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST event): sends an LE Credit Based Connection - * Response packet to a peer. - * - * @note A call to this function will require the application to keep the SDU data buffer alive - * until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX or - * @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. - * - * @events - * @event{@ref BLE_L2CAP_EVT_CH_SETUP, Setup successful.} - * @event{@ref BLE_L2CAP_EVT_CH_SETUP_REFUSED, Setup failed.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_SETUP_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in,out] p_local_cid Pointer to a uint16_t containing Local Channel ID of the L2CAP channel: - * - As input: @ref BLE_L2CAP_CID_INVALID when requesting setup of an L2CAP - * channel or local_cid provided in the @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST - * event when replying to a setup request of an L2CAP channel. - * - As output: local_cid for this channel. - * @param[in] p_params L2CAP channel parameters. - * - * @retval ::NRF_SUCCESS Successfully queued request or response for transmission. - * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. - * @retval ::NRF_ERROR_INVALID_LENGTH Supplied higher rx_mps than has been configured on this link. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (L2CAP channel already set up). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - * @retval ::NRF_ERROR_RESOURCES The limit has been reached for available L2CAP channels, - * see @ref ble_l2cap_conn_cfg_t::ch_count. - */ -SVCALL(SD_BLE_L2CAP_CH_SETUP, uint32_t, sd_ble_l2cap_ch_setup(uint16_t conn_handle, uint16_t *p_local_cid, ble_l2cap_ch_setup_params_t const *p_params)); - -/**@brief Release an L2CAP channel. - * - * @details This sends a Disconnection Request packet to a peer. - * - * @events - * @event{@ref BLE_L2CAP_EVT_CH_RELEASED, Release complete.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_RELEASE_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in] local_cid Local Channel ID of the L2CAP channel. - * - * @retval ::NRF_SUCCESS Successfully queued request for transmission. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is - * in progress for the L2CAP channel). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - */ -SVCALL(SD_BLE_L2CAP_CH_RELEASE, uint32_t, sd_ble_l2cap_ch_release(uint16_t conn_handle, uint16_t local_cid)); - -/**@brief Receive an SDU on an L2CAP channel. - * - * @details This may issue additional credits to the peer using an LE Flow Control Credit packet. - * - * @note A call to this function will require the application to keep the memory pointed by - * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX - * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. - * - * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::rx_queue_size SDU data buffers - * for reception per L2CAP channel. - * - * @events - * @event{@ref BLE_L2CAP_EVT_CH_RX, The SDU is received.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_RX_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in] local_cid Local Channel ID of the L2CAP channel. - * @param[in] p_sdu_buf Pointer to the SDU data buffer. - * - * @retval ::NRF_SUCCESS Buffer accepted. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is - * in progress for an L2CAP channel). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - * @retval ::NRF_ERROR_RESOURCES Too many SDU data buffers supplied. Wait for a - * @ref BLE_L2CAP_EVT_CH_RX event and retry. - */ -SVCALL(SD_BLE_L2CAP_CH_RX, uint32_t, sd_ble_l2cap_ch_rx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); - -/**@brief Transmit an SDU on an L2CAP channel. - * - * @note A call to this function will require the application to keep the memory pointed by - * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_TX - * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event. - * - * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::tx_queue_size SDUs for - * transmission per L2CAP channel. - * - * @note The application can keep track of the available credits for transmission by following - * the procedure below: - * - Store initial credits given by the peer in a variable. - * (Initial credits are provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) - * - Decrement the variable, which stores the currently available credits, by - * ceiling((@ref ble_data_t::len + 2) / tx_mps) when a call to this function returns - * @ref NRF_SUCCESS. (tx_mps is provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.) - * - Increment the variable, which stores the currently available credits, by additional - * credits given by the peer in a @ref BLE_L2CAP_EVT_CH_CREDIT event. - * - * @events - * @event{@ref BLE_L2CAP_EVT_CH_TX, The SDU is transmitted.} - * @endevents - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_TX_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in] local_cid Local Channel ID of the L2CAP channel. - * @param[in] p_sdu_buf Pointer to the SDU data buffer. - * - * @retval ::NRF_SUCCESS Successfully queued L2CAP SDU for transmission. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is - * in progress for the L2CAP channel). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - * @retval ::NRF_ERROR_DATA_SIZE Invalid SDU length supplied, must not be more than - * @ref ble_l2cap_ch_tx_params_t::tx_mtu provided in - * @ref BLE_L2CAP_EVT_CH_SETUP event. - * @retval ::NRF_ERROR_RESOURCES Too many SDUs queued for transmission. Wait for a - * @ref BLE_L2CAP_EVT_CH_TX event and retry. - */ -SVCALL(SD_BLE_L2CAP_CH_TX, uint32_t, sd_ble_l2cap_ch_tx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf)); - -/**@brief Advanced SDU reception flow control. - * - * @details Adjust the way the SoftDevice issues credits to the peer. - * This may issue additional credits to the peer using an LE Flow Control Credit packet. - * - * @mscs - * @mmsc{@ref BLE_L2CAP_CH_FLOW_CONTROL_MSC} - * @endmscs - * - * @param[in] conn_handle Connection Handle. - * @param[in] local_cid Local Channel ID of the L2CAP channel or @ref BLE_L2CAP_CID_INVALID to set - * the value that will be used for newly created channels. - * @param[in] credits Number of credits that the SoftDevice will make sure the peer has every - * time it starts using a new reception buffer. - * - @ref BLE_L2CAP_CREDITS_DEFAULT is the default value the SoftDevice will - * use if this function is not called. - * - If set to zero, the SoftDevice will stop issuing credits for new reception - * buffers the application provides or has provided. SDU reception that is - * currently ongoing will be allowed to complete. - * @param[out] p_credits NULL or pointer to a uint16_t. If a valid pointer is provided, it will be - * written by the SoftDevice with the number of credits that is or will be - * available to the peer. If the value written by the SoftDevice is 0 when - * credits parameter was set to 0, the peer will not be able to send more - * data until more credits are provided by calling this function again with - * credits > 0. This parameter is ignored when local_cid is set to @ref - * BLE_L2CAP_CID_INVALID. - * - * @note Application should take care when setting number of credits higher than default value. In - * this case the application must make sure that the SoftDevice always has reception buffers - * available (see @ref sd_ble_l2cap_ch_rx) for that channel. If the SoftDevice does not have - * such buffers available, packets may be NACKed on the Link Layer and all Bluetooth traffic - * on the connection handle may be stalled until the SoftDevice again has an available - * reception buffer. This applies even if the application has used this call to set the - * credits back to default, or zero. - * - * @retval ::NRF_SUCCESS Flow control parameters accepted. - * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied. - * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle. - * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is - * in progress for an L2CAP channel). - * @retval ::NRF_ERROR_NOT_FOUND CID not found. - */ -SVCALL(SD_BLE_L2CAP_CH_FLOW_CONTROL, uint32_t, sd_ble_l2cap_ch_flow_control(uint16_t conn_handle, uint16_t local_cid, uint16_t credits, uint16_t *p_credits)); - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // BLE_L2CAP_H__ - -/** - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_ranges.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_ranges.h deleted file mode 100644 index 5b9d891402..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_ranges.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above 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 Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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. - */ - -/** - @addtogroup BLE_COMMON - @{ - @defgroup ble_ranges Module specific SVC, event and option number subranges - @{ - - @brief Definition of SVC, event and option number subranges for each API module. - - @note - SVCs, event and option numbers are split into subranges for each API module. - Each module receives its entire allocated range of SVC calls, whether implemented or not, - but return BLE_ERROR_NOT_SUPPORTED for unimplemented or undefined calls in its range. - - Note that the symbols BLE__SVC_LAST is the end of the allocated SVC range, - rather than the last SVC function call actually defined and implemented. - - Specific SVC, event and option values are defined in each module's ble_.h file, - which defines names of each individual SVC code based on the range start value. -*/ - -#ifndef BLE_RANGES_H__ -#define BLE_RANGES_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define BLE_SVC_BASE 0x60 /**< Common BLE SVC base. */ -#define BLE_SVC_LAST 0x6B /**< Common BLE SVC last. */ - -#define BLE_GAP_SVC_BASE 0x6C /**< GAP BLE SVC base. */ -#define BLE_GAP_SVC_LAST 0x93 /**< GAP BLE SVC last. */ - -#define BLE_GATTC_SVC_BASE 0x94 /**< GATTC BLE SVC base. */ -#define BLE_GATTC_SVC_LAST 0x9F /**< GATTC BLE SVC last. */ - -#define BLE_GATTS_SVC_BASE 0xA0 /**< GATTS BLE SVC base. */ -#define BLE_GATTS_SVC_LAST 0xAF /**< GATTS BLE SVC last. */ - -#define BLE_L2CAP_SVC_BASE 0xB0 /**< L2CAP BLE SVC base. */ -#define BLE_L2CAP_SVC_LAST 0xBF /**< L2CAP BLE SVC last. */ - - -#define BLE_EVT_INVALID 0x00 /**< Invalid BLE Event. */ - -#define BLE_EVT_BASE 0x01 /**< Common BLE Event base. */ -#define BLE_EVT_LAST 0x0F /**< Common BLE Event last. */ - -#define BLE_GAP_EVT_BASE 0x10 /**< GAP BLE Event base. */ -#define BLE_GAP_EVT_LAST 0x2F /**< GAP BLE Event last. */ - -#define BLE_GATTC_EVT_BASE 0x30 /**< GATTC BLE Event base. */ -#define BLE_GATTC_EVT_LAST 0x4F /**< GATTC BLE Event last. */ - -#define BLE_GATTS_EVT_BASE 0x50 /**< GATTS BLE Event base. */ -#define BLE_GATTS_EVT_LAST 0x6F /**< GATTS BLE Event last. */ - -#define BLE_L2CAP_EVT_BASE 0x70 /**< L2CAP BLE Event base. */ -#define BLE_L2CAP_EVT_LAST 0x8F /**< L2CAP BLE Event last. */ - - -#define BLE_OPT_INVALID 0x00 /**< Invalid BLE Option. */ - -#define BLE_OPT_BASE 0x01 /**< Common BLE Option base. */ -#define BLE_OPT_LAST 0x1F /**< Common BLE Option last. */ - -#define BLE_GAP_OPT_BASE 0x20 /**< GAP BLE Option base. */ -#define BLE_GAP_OPT_LAST 0x3F /**< GAP BLE Option last. */ - -#define BLE_GATT_OPT_BASE 0x40 /**< GATT BLE Option base. */ -#define BLE_GATT_OPT_LAST 0x5F /**< GATT BLE Option last. */ - -#define BLE_GATTC_OPT_BASE 0x60 /**< GATTC BLE Option base. */ -#define BLE_GATTC_OPT_LAST 0x7F /**< GATTC BLE Option last. */ - -#define BLE_GATTS_OPT_BASE 0x80 /**< GATTS BLE Option base. */ -#define BLE_GATTS_OPT_LAST 0x9F /**< GATTS BLE Option last. */ - -#define BLE_L2CAP_OPT_BASE 0xA0 /**< L2CAP BLE Option base. */ -#define BLE_L2CAP_OPT_LAST 0xBF /**< L2CAP BLE Option last. */ - - -#define BLE_CFG_INVALID 0x00 /**< Invalid BLE configuration. */ - -#define BLE_CFG_BASE 0x01 /**< Common BLE configuration base. */ -#define BLE_CFG_LAST 0x1F /**< Common BLE configuration last. */ - -#define BLE_CONN_CFG_BASE 0x20 /**< BLE connection configuration base. */ -#define BLE_CONN_CFG_LAST 0x3F /**< BLE connection configuration last. */ - -#define BLE_GAP_CFG_BASE 0x40 /**< GAP BLE configuration base. */ -#define BLE_GAP_CFG_LAST 0x5F /**< GAP BLE configuration last. */ - -#define BLE_GATT_CFG_BASE 0x60 /**< GATT BLE configuration base. */ -#define BLE_GATT_CFG_LAST 0x7F /**< GATT BLE configuration last. */ - -#define BLE_GATTC_CFG_BASE 0x80 /**< GATTC BLE configuration base. */ -#define BLE_GATTC_CFG_LAST 0x9F /**< GATTC BLE configuration last. */ - -#define BLE_GATTS_CFG_BASE 0xA0 /**< GATTS BLE configuration base. */ -#define BLE_GATTS_CFG_LAST 0xBF /**< GATTS BLE configuration last. */ - -#define BLE_L2CAP_CFG_BASE 0xC0 /**< L2CAP BLE configuration base. */ -#define BLE_L2CAP_CFG_LAST 0xDF /**< L2CAP BLE configuration last. */ - - - - - -#ifdef __cplusplus -} -#endif -#endif /* BLE_RANGES_H__ */ - -/** - @} - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_types.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_types.h deleted file mode 100644 index 88c93180c8..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/ble_types.h +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above 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 Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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. - */ - -/** - @addtogroup BLE_COMMON - @{ - @defgroup ble_types Common types and macro definitions - @{ - - @brief Common types and macro definitions for the BLE SoftDevice. - */ - -#ifndef BLE_TYPES_H__ -#define BLE_TYPES_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup BLE_TYPES_DEFINES Defines - * @{ */ - -/** @defgroup BLE_CONN_HANDLES BLE Connection Handles - * @{ */ -#define BLE_CONN_HANDLE_INVALID 0xFFFF /**< Invalid Connection Handle. */ -#define BLE_CONN_HANDLE_ALL 0xFFFE /**< Applies to all Connection Handles. */ -/** @} */ - - -/** @defgroup BLE_UUID_VALUES Assigned Values for BLE UUIDs - * @{ */ -/* Generic UUIDs, applicable to all services */ -#define BLE_UUID_UNKNOWN 0x0000 /**< Reserved UUID. */ -#define BLE_UUID_SERVICE_PRIMARY 0x2800 /**< Primary Service. */ -#define BLE_UUID_SERVICE_SECONDARY 0x2801 /**< Secondary Service. */ -#define BLE_UUID_SERVICE_INCLUDE 0x2802 /**< Include. */ -#define BLE_UUID_CHARACTERISTIC 0x2803 /**< Characteristic. */ -#define BLE_UUID_DESCRIPTOR_CHAR_EXT_PROP 0x2900 /**< Characteristic Extended Properties Descriptor. */ -#define BLE_UUID_DESCRIPTOR_CHAR_USER_DESC 0x2901 /**< Characteristic User Description Descriptor. */ -#define BLE_UUID_DESCRIPTOR_CLIENT_CHAR_CONFIG 0x2902 /**< Client Characteristic Configuration Descriptor. */ -#define BLE_UUID_DESCRIPTOR_SERVER_CHAR_CONFIG 0x2903 /**< Server Characteristic Configuration Descriptor. */ -#define BLE_UUID_DESCRIPTOR_CHAR_PRESENTATION_FORMAT 0x2904 /**< Characteristic Presentation Format Descriptor. */ -#define BLE_UUID_DESCRIPTOR_CHAR_AGGREGATE_FORMAT 0x2905 /**< Characteristic Aggregate Format Descriptor. */ -/* GATT specific UUIDs */ -#define BLE_UUID_GATT 0x1801 /**< Generic Attribute Profile. */ -#define BLE_UUID_GATT_CHARACTERISTIC_SERVICE_CHANGED 0x2A05 /**< Service Changed Characteristic. */ -/* GAP specific UUIDs */ -#define BLE_UUID_GAP 0x1800 /**< Generic Access Profile. */ -#define BLE_UUID_GAP_CHARACTERISTIC_DEVICE_NAME 0x2A00 /**< Device Name Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_APPEARANCE 0x2A01 /**< Appearance Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_RECONN_ADDR 0x2A03 /**< Reconnection Address Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_PPCP 0x2A04 /**< Peripheral Preferred Connection Parameters Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_CAR 0x2AA6 /**< Central Address Resolution Characteristic. */ -#define BLE_UUID_GAP_CHARACTERISTIC_RPA_ONLY 0x2AC9 /**< Resolvable Private Address Only Characteristic. */ -/** @} */ - - -/** @defgroup BLE_UUID_TYPES Types of UUID - * @{ */ -#define BLE_UUID_TYPE_UNKNOWN 0x00 /**< Invalid UUID type. */ -#define BLE_UUID_TYPE_BLE 0x01 /**< Bluetooth SIG UUID (16-bit). */ -#define BLE_UUID_TYPE_VENDOR_BEGIN 0x02 /**< Vendor UUID types start at this index (128-bit). */ -/** @} */ - - -/** @defgroup BLE_APPEARANCES Bluetooth Appearance values - * @note Retrieved from http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml - * @{ */ -#define BLE_APPEARANCE_UNKNOWN 0 /**< Unknown. */ -#define BLE_APPEARANCE_GENERIC_PHONE 64 /**< Generic Phone. */ -#define BLE_APPEARANCE_GENERIC_COMPUTER 128 /**< Generic Computer. */ -#define BLE_APPEARANCE_GENERIC_WATCH 192 /**< Generic Watch. */ -#define BLE_APPEARANCE_WATCH_SPORTS_WATCH 193 /**< Watch: Sports Watch. */ -#define BLE_APPEARANCE_GENERIC_CLOCK 256 /**< Generic Clock. */ -#define BLE_APPEARANCE_GENERIC_DISPLAY 320 /**< Generic Display. */ -#define BLE_APPEARANCE_GENERIC_REMOTE_CONTROL 384 /**< Generic Remote Control. */ -#define BLE_APPEARANCE_GENERIC_EYE_GLASSES 448 /**< Generic Eye-glasses. */ -#define BLE_APPEARANCE_GENERIC_TAG 512 /**< Generic Tag. */ -#define BLE_APPEARANCE_GENERIC_KEYRING 576 /**< Generic Keyring. */ -#define BLE_APPEARANCE_GENERIC_MEDIA_PLAYER 640 /**< Generic Media Player. */ -#define BLE_APPEARANCE_GENERIC_BARCODE_SCANNER 704 /**< Generic Barcode Scanner. */ -#define BLE_APPEARANCE_GENERIC_THERMOMETER 768 /**< Generic Thermometer. */ -#define BLE_APPEARANCE_THERMOMETER_EAR 769 /**< Thermometer: Ear. */ -#define BLE_APPEARANCE_GENERIC_HEART_RATE_SENSOR 832 /**< Generic Heart rate Sensor. */ -#define BLE_APPEARANCE_HEART_RATE_SENSOR_HEART_RATE_BELT 833 /**< Heart Rate Sensor: Heart Rate Belt. */ -#define BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE 896 /**< Generic Blood Pressure. */ -#define BLE_APPEARANCE_BLOOD_PRESSURE_ARM 897 /**< Blood Pressure: Arm. */ -#define BLE_APPEARANCE_BLOOD_PRESSURE_WRIST 898 /**< Blood Pressure: Wrist. */ -#define BLE_APPEARANCE_GENERIC_HID 960 /**< Human Interface Device (HID). */ -#define BLE_APPEARANCE_HID_KEYBOARD 961 /**< Keyboard (HID Subtype). */ -#define BLE_APPEARANCE_HID_MOUSE 962 /**< Mouse (HID Subtype). */ -#define BLE_APPEARANCE_HID_JOYSTICK 963 /**< Joystick (HID Subtype). */ -#define BLE_APPEARANCE_HID_GAMEPAD 964 /**< Gamepad (HID Subtype). */ -#define BLE_APPEARANCE_HID_DIGITIZERSUBTYPE 965 /**< Digitizer Tablet (HID Subtype). */ -#define BLE_APPEARANCE_HID_CARD_READER 966 /**< Card Reader (HID Subtype). */ -#define BLE_APPEARANCE_HID_DIGITAL_PEN 967 /**< Digital Pen (HID Subtype). */ -#define BLE_APPEARANCE_HID_BARCODE 968 /**< Barcode Scanner (HID Subtype). */ -#define BLE_APPEARANCE_GENERIC_GLUCOSE_METER 1024 /**< Generic Glucose Meter. */ -#define BLE_APPEARANCE_GENERIC_RUNNING_WALKING_SENSOR 1088 /**< Generic Running Walking Sensor. */ -#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_IN_SHOE 1089 /**< Running Walking Sensor: In-Shoe. */ -#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_SHOE 1090 /**< Running Walking Sensor: On-Shoe. */ -#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_HIP 1091 /**< Running Walking Sensor: On-Hip. */ -#define BLE_APPEARANCE_GENERIC_CYCLING 1152 /**< Generic Cycling. */ -#define BLE_APPEARANCE_CYCLING_CYCLING_COMPUTER 1153 /**< Cycling: Cycling Computer. */ -#define BLE_APPEARANCE_CYCLING_SPEED_SENSOR 1154 /**< Cycling: Speed Sensor. */ -#define BLE_APPEARANCE_CYCLING_CADENCE_SENSOR 1155 /**< Cycling: Cadence Sensor. */ -#define BLE_APPEARANCE_CYCLING_POWER_SENSOR 1156 /**< Cycling: Power Sensor. */ -#define BLE_APPEARANCE_CYCLING_SPEED_CADENCE_SENSOR 1157 /**< Cycling: Speed and Cadence Sensor. */ -#define BLE_APPEARANCE_GENERIC_PULSE_OXIMETER 3136 /**< Generic Pulse Oximeter. */ -#define BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP 3137 /**< Fingertip (Pulse Oximeter subtype). */ -#define BLE_APPEARANCE_PULSE_OXIMETER_WRIST_WORN 3138 /**< Wrist Worn(Pulse Oximeter subtype). */ -#define BLE_APPEARANCE_GENERIC_WEIGHT_SCALE 3200 /**< Generic Weight Scale. */ -#define BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS_ACT 5184 /**< Generic Outdoor Sports Activity. */ -#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_DISP 5185 /**< Location Display Device (Outdoor Sports Activity subtype). */ -#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_DISP 5186 /**< Location and Navigation Display Device (Outdoor Sports Activity subtype). */ -#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_POD 5187 /**< Location Pod (Outdoor Sports Activity subtype). */ -#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_POD 5188 /**< Location and Navigation Pod (Outdoor Sports Activity subtype). */ -/** @} */ - -/** @brief Set .type and .uuid fields of ble_uuid_struct to specified UUID value. */ -#define BLE_UUID_BLE_ASSIGN(instance, value) do {\ - instance.type = BLE_UUID_TYPE_BLE; \ - instance.uuid = value;} while(0) - -/** @brief Copy type and uuid members from src to dst ble_uuid_t pointer. Both pointers must be valid/non-null. */ -#define BLE_UUID_COPY_PTR(dst, src) do {\ - (dst)->type = (src)->type; \ - (dst)->uuid = (src)->uuid;} while(0) - -/** @brief Copy type and uuid members from src to dst ble_uuid_t struct. */ -#define BLE_UUID_COPY_INST(dst, src) do {\ - (dst).type = (src).type; \ - (dst).uuid = (src).uuid;} while(0) - -/** @brief Compare for equality both type and uuid members of two (valid, non-null) ble_uuid_t pointers. */ -#define BLE_UUID_EQ(p_uuid1, p_uuid2) \ - (((p_uuid1)->type == (p_uuid2)->type) && ((p_uuid1)->uuid == (p_uuid2)->uuid)) - -/** @brief Compare for difference both type and uuid members of two (valid, non-null) ble_uuid_t pointers. */ -#define BLE_UUID_NEQ(p_uuid1, p_uuid2) \ - (((p_uuid1)->type != (p_uuid2)->type) || ((p_uuid1)->uuid != (p_uuid2)->uuid)) - -/** @} */ - -/** @addtogroup BLE_TYPES_STRUCTURES Structures - * @{ */ - -/** @brief 128 bit UUID values. */ -typedef struct -{ - uint8_t uuid128[16]; /**< Little-Endian UUID bytes. */ -} ble_uuid128_t; - -/** @brief Bluetooth Low Energy UUID type, encapsulates both 16-bit and 128-bit UUIDs. */ -typedef struct -{ - uint16_t uuid; /**< 16-bit UUID value or octets 12-13 of 128-bit UUID. */ - uint8_t type; /**< UUID type, see @ref BLE_UUID_TYPES. If type is @ref BLE_UUID_TYPE_UNKNOWN, the value of uuid is undefined. */ -} ble_uuid_t; - -/**@brief Data structure. */ -typedef struct -{ - uint8_t *p_data; /**< Pointer to the data buffer provided to/from the application. */ - uint16_t len; /**< Length of the data buffer, in bytes. */ -} ble_data_t; - -/** @} */ -#ifdef __cplusplus -} -#endif - -#endif /* BLE_TYPES_H__ */ - -/** - @} - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf52/nrf_mbr.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf52/nrf_mbr.h deleted file mode 100644 index c95bb8d4fd..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf52/nrf_mbr.h +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above 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 Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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. - */ - -/** - @defgroup nrf_mbr_api Master Boot Record API - @{ - - @brief APIs for updating SoftDevice and BootLoader - -*/ - -#ifndef NRF_MBR_H__ -#define NRF_MBR_H__ - -#include "nrf_svc.h" -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup NRF_MBR_DEFINES Defines - * @{ */ - -/**@brief MBR SVC Base number. */ -#define MBR_SVC_BASE (0x18) - -/**@brief Page size in words. */ -#define MBR_PAGE_SIZE_IN_WORDS (1024) - -/** @brief The size that must be reserved for the MBR when a SoftDevice is written to flash. -This is the offset where the first byte of the SoftDevice hex file is written.*/ -#define MBR_SIZE (0x1000) - -/** @} */ - -/** @addtogroup NRF_MBR_ENUMS Enumerations - * @{ */ - -/**@brief nRF Master Boot Record API SVC numbers. */ -enum NRF_MBR_SVCS -{ - SD_MBR_COMMAND = MBR_SVC_BASE, /**< ::sd_mbr_command */ -}; - -/**@brief Possible values for ::sd_mbr_command_t.command */ -enum NRF_MBR_COMMANDS -{ - SD_MBR_COMMAND_COPY_BL, /**< Copy a new BootLoader. @see sd_mbr_command_copy_bl_t*/ - SD_MBR_COMMAND_COPY_SD, /**< Copy a new SoftDevice. @see ::sd_mbr_command_copy_sd_t*/ - SD_MBR_COMMAND_INIT_SD, /**< Initialize forwarding interrupts to SD, and run reset function in SD*/ - SD_MBR_COMMAND_COMPARE, /**< This command works like memcmp. @see ::sd_mbr_command_compare_t*/ - SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET, /**< Change the address the MBR starts after a reset @see ::sd_mbr_command_vector_table_base_set_t*/ - SD_MBR_COMMAND_RESERVED, - SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET, /**< Start forwarding all interrupts to this address @see ::sd_mbr_command_irq_forward_address_set_t*/ -}; - -/** @} */ - -/** @addtogroup NRF_MBR_TYPES Types - * @{ */ - -/**@brief This command copies part of a new SoftDevice - * The destination area is erased before copying. - * If dst is in the middle of a flash page, that whole flash page will be erased. - * If (dst+len) is in the middle of a flash page, that whole flash page will be erased. - * - * The user of this function is responsible for setting the BPROT registers. - * - * @retval ::NRF_SUCCESS indicates that the contents of the memory blocks where copied correctly. - * @retval ::NRF_ERROR_INTERNAL indicates that the contents of the memory blocks where not verified correctly after copying. - */ -typedef struct -{ - uint32_t *src; /**< Pointer to the source of data to be copied.*/ - uint32_t *dst; /**< Pointer to the destination where the content is to be copied.*/ - uint32_t len; /**< Number of 32 bit words to copy. Must be a multiple of @ref MBR_PAGE_SIZE_IN_WORDS words.*/ -} sd_mbr_command_copy_sd_t; - - -/**@brief This command works like memcmp, but takes the length in words. - * - * @retval ::NRF_SUCCESS indicates that the contents of both memory blocks are equal. - * @retval ::NRF_ERROR_NULL indicates that the contents of the memory blocks are not equal. - */ -typedef struct -{ - uint32_t *ptr1; /**< Pointer to block of memory. */ - uint32_t *ptr2; /**< Pointer to block of memory. */ - uint32_t len; /**< Number of 32 bit words to compare.*/ -} sd_mbr_command_compare_t; - - -/**@brief This command copies a new BootLoader. - * With this command, destination of BootLoader is always the address written in NRF_UICR->BOOTADDR. - * - * Destination is erased by this function. - * If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased. - * - * This function will use PROTENSET to protect the flash that is not intended to be written. - * - * On success, this function will not return. It will start the new BootLoader from reset-vector as normal. - * - * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. - * @retval ::NRF_ERROR_FORBIDDEN if NRF_UICR->BOOTADDR is not set. - * @retval ::NRF_ERROR_INVALID_LENGTH if parameters attempts to read or write outside flash area. - * @retval ::NRF_ERROR_NO_MEM if no parameter page is provided (see SoftDevice Specification for more info) - */ -typedef struct -{ - uint32_t *bl_src; /**< Pointer to the source of the Bootloader to be be copied.*/ - uint32_t bl_len; /**< Number of 32 bit words to copy for BootLoader. */ -} sd_mbr_command_copy_bl_t; - -/**@brief Change the address the MBR starts after a reset - * - * Once this function has been called, this address is where the MBR will start to forward interrupts to after a reset. - * - * To restore default forwarding this function should be called with @param address set to 0. - * The MBR will then start forwarding to interrupts to the address in NFR_UICR->BOOTADDR or to the SoftDevice if the BOOTADDR is not set. - * - * On success, this function will not return. It will reset the device. - * - * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen. - * @retval ::NRF_ERROR_INVALID_ADDR if parameter address is outside of the flash size. - * @retval ::NRF_ERROR_NO_MEM if no parameter page is provided (see SoftDevice Specification for more info) - */ -typedef struct -{ - uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ -} sd_mbr_command_vector_table_base_set_t; - -/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the MBR - * Unlike sd_mbr_command_vector_table_base_set_t, this function does not reset, and it does not - * change where the MBR starts after reset. - * - * @retval ::NRF_SUCCESS - */ -typedef struct -{ - uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/ -} sd_mbr_command_irq_forward_address_set_t; - -typedef struct -{ - uint32_t command; /**< type of command to be issued see @ref NRF_MBR_COMMANDS. */ - union - { - sd_mbr_command_copy_sd_t copy_sd; /**< Parameters for copy SoftDevice.*/ - sd_mbr_command_compare_t compare; /**< Parameters for verify.*/ - sd_mbr_command_copy_bl_t copy_bl; /**< Parameters for copy BootLoader. Requires parameter page. */ - sd_mbr_command_vector_table_base_set_t base_set; /**< Parameters for vector table base set. Requires parameter page.*/ - sd_mbr_command_irq_forward_address_set_t irq_forward_address_set; /**< Parameters for irq forward address set*/ - } params; -} sd_mbr_command_t; - -/** @} */ - -/** @addtogroup NRF_MBR_FUNCTIONS Functions - * @{ */ - -/**@brief Issue Master Boot Record commands - * - * Commands used when updating a SoftDevice and bootloader. - * - * The SD_MBR_COMMAND_COPY_BL and SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET requires parameters to be - * retained by the MBR when resetting the IC. This is done in a separate flash page - * provided by the application. The UICR register UICR.NRFFW[1] must be set - * to an address corresponding to a page in the application flash space. This page will be cleared - * by the MBR and used to store the command before reset. When the UICR.NRFFW[1] field is set - * the page it refers to must not be used by the application. If the UICR.NRFFW[1] is set to - * 0xFFFFFFFF (the default) MBR commands which use flash will be unavailable and return - * NRF_ERROR_NO_MEM. - * - * @param[in] param Pointer to a struct describing the command. - * - * @note For return values, see ::sd_mbr_command_copy_sd_t ::sd_mbr_command_copy_bl_t ::sd_mbr_command_compare_t ::sd_mbr_command_vector_table_base_set_t ::sd_mbr_command_irq_forward_address_set_t - * - * @retval NRF_ERROR_NO_MEM if UICR.NRFFW[1] is not set (i.e. is 0xFFFFFFFF). - * @retval NRF_ERROR_INVALID_PARAM if an invalid command is given. -*/ -SVCALL(SD_MBR_COMMAND, uint32_t, sd_mbr_command(sd_mbr_command_t* param)); - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // NRF_MBR_H__ - -/** - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_error.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_error.h deleted file mode 100644 index 6badee98e5..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_error.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above 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 Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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. - */ - - /** - @defgroup nrf_error SoftDevice Global Error Codes - @{ - - @brief Global Error definitions -*/ - -/* Header guard */ -#ifndef NRF_ERROR_H__ -#define NRF_ERROR_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/** @defgroup NRF_ERRORS_BASE Error Codes Base number definitions - * @{ */ -#define NRF_ERROR_BASE_NUM (0x0) ///< Global error base -#define NRF_ERROR_SDM_BASE_NUM (0x1000) ///< SDM error base -#define NRF_ERROR_SOC_BASE_NUM (0x2000) ///< SoC error base -#define NRF_ERROR_STK_BASE_NUM (0x3000) ///< STK error base -/** @} */ - -#define NRF_SUCCESS (NRF_ERROR_BASE_NUM + 0) ///< Successful command -#define NRF_ERROR_SVC_HANDLER_MISSING (NRF_ERROR_BASE_NUM + 1) ///< SVC handler is missing -#define NRF_ERROR_SOFTDEVICE_NOT_ENABLED (NRF_ERROR_BASE_NUM + 2) ///< SoftDevice has not been enabled -#define NRF_ERROR_INTERNAL (NRF_ERROR_BASE_NUM + 3) ///< Internal Error -#define NRF_ERROR_NO_MEM (NRF_ERROR_BASE_NUM + 4) ///< No Memory for operation -#define NRF_ERROR_NOT_FOUND (NRF_ERROR_BASE_NUM + 5) ///< Not found -#define NRF_ERROR_NOT_SUPPORTED (NRF_ERROR_BASE_NUM + 6) ///< Not supported -#define NRF_ERROR_INVALID_PARAM (NRF_ERROR_BASE_NUM + 7) ///< Invalid Parameter -#define NRF_ERROR_INVALID_STATE (NRF_ERROR_BASE_NUM + 8) ///< Invalid state, operation disallowed in this state -#define NRF_ERROR_INVALID_LENGTH (NRF_ERROR_BASE_NUM + 9) ///< Invalid Length -#define NRF_ERROR_INVALID_FLAGS (NRF_ERROR_BASE_NUM + 10) ///< Invalid Flags -#define NRF_ERROR_INVALID_DATA (NRF_ERROR_BASE_NUM + 11) ///< Invalid Data -#define NRF_ERROR_DATA_SIZE (NRF_ERROR_BASE_NUM + 12) ///< Invalid Data size -#define NRF_ERROR_TIMEOUT (NRF_ERROR_BASE_NUM + 13) ///< Operation timed out -#define NRF_ERROR_NULL (NRF_ERROR_BASE_NUM + 14) ///< Null Pointer -#define NRF_ERROR_FORBIDDEN (NRF_ERROR_BASE_NUM + 15) ///< Forbidden Operation -#define NRF_ERROR_INVALID_ADDR (NRF_ERROR_BASE_NUM + 16) ///< Bad Memory Address -#define NRF_ERROR_BUSY (NRF_ERROR_BASE_NUM + 17) ///< Busy -#define NRF_ERROR_CONN_COUNT (NRF_ERROR_BASE_NUM + 18) ///< Maximum connection count exceeded. -#define NRF_ERROR_RESOURCES (NRF_ERROR_BASE_NUM + 19) ///< Not enough resources for operation - -#ifdef __cplusplus -} -#endif -#endif // NRF_ERROR_H__ - -/** - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_error_sdm.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_error_sdm.h deleted file mode 100644 index 530959b9d6..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_error_sdm.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above 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 Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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. - */ - - /** - @addtogroup nrf_sdm_api - @{ - @defgroup nrf_sdm_error SoftDevice Manager Error Codes - @{ - - @brief Error definitions for the SDM API -*/ - -/* Header guard */ -#ifndef NRF_ERROR_SDM_H__ -#define NRF_ERROR_SDM_H__ - -#include "nrf_error.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN (NRF_ERROR_SDM_BASE_NUM + 0) ///< Unknown LFCLK source. -#define NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION (NRF_ERROR_SDM_BASE_NUM + 1) ///< Incorrect interrupt configuration (can be caused by using illegal priority levels, or having enabled SoftDevice interrupts). -#define NRF_ERROR_SDM_INCORRECT_CLENR0 (NRF_ERROR_SDM_BASE_NUM + 2) ///< Incorrect CLENR0 (can be caused by erroneous SoftDevice flashing). - -#ifdef __cplusplus -} -#endif -#endif // NRF_ERROR_SDM_H__ - -/** - @} - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_error_soc.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_error_soc.h deleted file mode 100644 index 1e784b8db3..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_error_soc.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above 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 Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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. - */ - -/** - @addtogroup nrf_soc_api - @{ - @defgroup nrf_soc_error SoC Library Error Codes - @{ - - @brief Error definitions for the SoC library - -*/ - -/* Header guard */ -#ifndef NRF_ERROR_SOC_H__ -#define NRF_ERROR_SOC_H__ - -#include "nrf_error.h" -#ifdef __cplusplus -extern "C" { -#endif - -/* Mutex Errors */ -#define NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN (NRF_ERROR_SOC_BASE_NUM + 0) ///< Mutex already taken - -/* NVIC errors */ -#define NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE (NRF_ERROR_SOC_BASE_NUM + 1) ///< NVIC interrupt not available -#define NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED (NRF_ERROR_SOC_BASE_NUM + 2) ///< NVIC interrupt priority not allowed -#define NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 3) ///< NVIC should not return - -/* Power errors */ -#define NRF_ERROR_SOC_POWER_MODE_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 4) ///< Power mode unknown -#define NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN (NRF_ERROR_SOC_BASE_NUM + 5) ///< Power POF threshold unknown -#define NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN (NRF_ERROR_SOC_BASE_NUM + 6) ///< Power off should not return - -/* Rand errors */ -#define NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES (NRF_ERROR_SOC_BASE_NUM + 7) ///< RAND not enough values - -/* PPI errors */ -#define NRF_ERROR_SOC_PPI_INVALID_CHANNEL (NRF_ERROR_SOC_BASE_NUM + 8) ///< Invalid PPI Channel -#define NRF_ERROR_SOC_PPI_INVALID_GROUP (NRF_ERROR_SOC_BASE_NUM + 9) ///< Invalid PPI Group - -#ifdef __cplusplus -} -#endif -#endif // NRF_ERROR_SOC_H__ -/** - @} - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_nvic.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_nvic.h deleted file mode 100644 index 40537b45a2..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_nvic.h +++ /dev/null @@ -1,485 +0,0 @@ -/* - * Copyright (c) 2016 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above 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 Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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. - */ - -/** - * @defgroup nrf_nvic_api SoftDevice NVIC API - * @{ - * - * @note In order to use this module, the following code has to be added to a .c file: - * \code - * nrf_nvic_state_t nrf_nvic_state = {0}; - * \endcode - * - * @note Definitions and declarations starting with __ (double underscore) in this header file are - * not intended for direct use by the application. - * - * @brief APIs for the accessing NVIC when using a SoftDevice. - * - */ - -#ifndef NRF_NVIC_H__ -#define NRF_NVIC_H__ - -#include -#include "nrf.h" - -#include "nrf_error_soc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup NRF_NVIC_DEFINES Defines - * @{ */ - -/**@defgroup NRF_NVIC_ISER_DEFINES SoftDevice NVIC internal definitions - * @{ */ - -#define __NRF_NVIC_NVMC_IRQn (30) /**< The peripheral ID of the NVMC. IRQ numbers are used to identify peripherals, but the NVMC doesn't have an IRQ number in the MDK. */ - -#define __NRF_NVIC_ISER_COUNT (2) /**< The number of ISER/ICER registers in the NVIC that are used. */ - -/**@brief Interrupts used by the SoftDevice, with IRQn in the range 0-31. */ -#define __NRF_NVIC_SD_IRQS_0 ((uint32_t)( \ - (1U << POWER_CLOCK_IRQn) \ - | (1U << RADIO_IRQn) \ - | (1U << RTC0_IRQn) \ - | (1U << TIMER0_IRQn) \ - | (1U << RNG_IRQn) \ - | (1U << ECB_IRQn) \ - | (1U << CCM_AAR_IRQn) \ - | (1U << TEMP_IRQn) \ - | (1U << __NRF_NVIC_NVMC_IRQn) \ - | (1U << (uint32_t)SWI5_EGU5_IRQn) \ - )) - -/**@brief Interrupts used by the SoftDevice, with IRQn in the range 32-63. */ -#define __NRF_NVIC_SD_IRQS_1 ((uint32_t)0) - -/**@brief Interrupts available for to application, with IRQn in the range 0-31. */ -#define __NRF_NVIC_APP_IRQS_0 (~__NRF_NVIC_SD_IRQS_0) - -/**@brief Interrupts available for to application, with IRQn in the range 32-63. */ -#define __NRF_NVIC_APP_IRQS_1 (~__NRF_NVIC_SD_IRQS_1) - -/**@} */ - -/**@} */ - -/**@addtogroup NRF_NVIC_VARIABLES Variables - * @{ */ - -/**@brief Type representing the state struct for the SoftDevice NVIC module. */ -typedef struct -{ - uint32_t volatile __irq_masks[__NRF_NVIC_ISER_COUNT]; /**< IRQs enabled by the application in the NVIC. */ - uint32_t volatile __cr_flag; /**< Non-zero if already in a critical region */ -} nrf_nvic_state_t; - -/**@brief Variable keeping the state for the SoftDevice NVIC module. This must be declared in an - * application source file. */ -extern nrf_nvic_state_t nrf_nvic_state; - -/**@} */ - -/**@addtogroup NRF_NVIC_INTERNAL_FUNCTIONS SoftDevice NVIC internal functions - * @{ */ - -/**@brief Disables IRQ interrupts globally, including the SoftDevice's interrupts. - * - * @retval The value of PRIMASK prior to disabling the interrupts. - */ -__STATIC_INLINE int __sd_nvic_irq_disable(void); - -/**@brief Enables IRQ interrupts globally, including the SoftDevice's interrupts. - */ -__STATIC_INLINE void __sd_nvic_irq_enable(void); - -/**@brief Checks if IRQn is available to application - * @param[in] IRQn IRQ to check - * - * @retval 1 (true) if the IRQ to check is available to the application - */ -__STATIC_INLINE uint32_t __sd_nvic_app_accessible_irq(IRQn_Type IRQn); - -/**@brief Checks if priority is available to application - * @param[in] priority priority to check - * - * @retval 1 (true) if the priority to check is available to the application - */ -__STATIC_INLINE uint32_t __sd_nvic_is_app_accessible_priority(uint32_t priority); - -/**@} */ - -/**@addtogroup NRF_NVIC_FUNCTIONS SoftDevice NVIC public functions - * @{ */ - -/**@brief Enable External Interrupt. - * @note Corresponds to NVIC_EnableIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_EnableIRQ documentation in CMSIS. - * - * @retval ::NRF_SUCCESS The interrupt was enabled. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE The interrupt is not available for the application. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED The interrupt has a priority not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_EnableIRQ(IRQn_Type IRQn); - -/**@brief Disable External Interrupt. - * @note Corresponds to NVIC_DisableIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_DisableIRQ documentation in CMSIS. - * - * @retval ::NRF_SUCCESS The interrupt was disabled. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE The interrupt is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_DisableIRQ(IRQn_Type IRQn); - -/**@brief Get Pending Interrupt. - * @note Corresponds to NVIC_GetPendingIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_GetPendingIRQ documentation in CMSIS. - * @param[out] p_pending_irq Return value from NVIC_GetPendingIRQ. - * - * @retval ::NRF_SUCCESS The interrupt is available for the application. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_GetPendingIRQ(IRQn_Type IRQn, uint32_t * p_pending_irq); - -/**@brief Set Pending Interrupt. - * @note Corresponds to NVIC_SetPendingIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_SetPendingIRQ documentation in CMSIS. - * - * @retval ::NRF_SUCCESS The interrupt is set pending. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_SetPendingIRQ(IRQn_Type IRQn); - -/**@brief Clear Pending Interrupt. - * @note Corresponds to NVIC_ClearPendingIRQ in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_ClearPendingIRQ documentation in CMSIS. - * - * @retval ::NRF_SUCCESS The interrupt pending flag is cleared. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_ClearPendingIRQ(IRQn_Type IRQn); - -/**@brief Set Interrupt Priority. - * @note Corresponds to NVIC_SetPriority in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * @pre Priority is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_SetPriority documentation in CMSIS. - * @param[in] priority A valid IRQ priority for use by the application. - * - * @retval ::NRF_SUCCESS The interrupt and priority level is available for the application. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED The interrupt priority is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_SetPriority(IRQn_Type IRQn, uint32_t priority); - -/**@brief Get Interrupt Priority. - * @note Corresponds to NVIC_GetPriority in CMSIS. - * - * @pre IRQn is valid and not reserved by the stack. - * - * @param[in] IRQn See the NVIC_GetPriority documentation in CMSIS. - * @param[out] p_priority Return value from NVIC_GetPriority. - * - * @retval ::NRF_SUCCESS The interrupt priority is returned in p_priority. - * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE - IRQn is not available for the application. - */ -__STATIC_INLINE uint32_t sd_nvic_GetPriority(IRQn_Type IRQn, uint32_t * p_priority); - -/**@brief System Reset. - * @note Corresponds to NVIC_SystemReset in CMSIS. - * - * @retval ::NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN - */ -__STATIC_INLINE uint32_t sd_nvic_SystemReset(void); - -/**@brief Enter critical region. - * - * @post Application interrupts will be disabled. - * @note sd_nvic_critical_region_enter() and ::sd_nvic_critical_region_exit() must be called in matching pairs inside each - * execution context - * @sa sd_nvic_critical_region_exit - * - * @param[out] p_is_nested_critical_region If 1, the application is now in a nested critical region. - * - * @retval ::NRF_SUCCESS - */ -__STATIC_INLINE uint32_t sd_nvic_critical_region_enter(uint8_t * p_is_nested_critical_region); - -/**@brief Exit critical region. - * - * @pre Application has entered a critical region using ::sd_nvic_critical_region_enter. - * @post If not in a nested critical region, the application interrupts will restored to the state before ::sd_nvic_critical_region_enter was called. - * - * @param[in] is_nested_critical_region If this is set to 1, the critical region won't be exited. @sa sd_nvic_critical_region_enter. - * - * @retval ::NRF_SUCCESS - */ -__STATIC_INLINE uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_critical_region); - -/**@} */ - -#ifndef SUPPRESS_INLINE_IMPLEMENTATION - -__STATIC_INLINE int __sd_nvic_irq_disable(void) -{ - int pm = __get_PRIMASK(); - __disable_irq(); - return pm; -} - -__STATIC_INLINE void __sd_nvic_irq_enable(void) -{ - __enable_irq(); -} - -__STATIC_INLINE uint32_t __sd_nvic_app_accessible_irq(IRQn_Type IRQn) -{ - if (IRQn < 32) - { - return ((1UL<= (1 << __NVIC_PRIO_BITS)) - { - return 0; - } - if( priority == 0 - || priority == 1 - || priority == 4 - ) - { - return 0; - } - return 1; -} - - -__STATIC_INLINE uint32_t sd_nvic_EnableIRQ(IRQn_Type IRQn) -{ - if (!__sd_nvic_app_accessible_irq(IRQn)) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } - if (!__sd_nvic_is_app_accessible_priority(NVIC_GetPriority(IRQn))) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED; - } - - if (nrf_nvic_state.__cr_flag) - { - nrf_nvic_state.__irq_masks[(uint32_t)((int32_t)IRQn) >> 5] |= (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F)); - } - else - { - NVIC_EnableIRQ(IRQn); - } - return NRF_SUCCESS; -} - -__STATIC_INLINE uint32_t sd_nvic_DisableIRQ(IRQn_Type IRQn) -{ - if (!__sd_nvic_app_accessible_irq(IRQn)) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } - - if (nrf_nvic_state.__cr_flag) - { - nrf_nvic_state.__irq_masks[(uint32_t)((int32_t)IRQn) >> 5] &= ~(1UL << ((uint32_t)(IRQn) & 0x1F)); - } - else - { - NVIC_DisableIRQ(IRQn); - } - - return NRF_SUCCESS; -} - -__STATIC_INLINE uint32_t sd_nvic_GetPendingIRQ(IRQn_Type IRQn, uint32_t * p_pending_irq) -{ - if (__sd_nvic_app_accessible_irq(IRQn)) - { - *p_pending_irq = NVIC_GetPendingIRQ(IRQn); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } -} - -__STATIC_INLINE uint32_t sd_nvic_SetPendingIRQ(IRQn_Type IRQn) -{ - if (__sd_nvic_app_accessible_irq(IRQn)) - { - NVIC_SetPendingIRQ(IRQn); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } -} - -__STATIC_INLINE uint32_t sd_nvic_ClearPendingIRQ(IRQn_Type IRQn) -{ - if (__sd_nvic_app_accessible_irq(IRQn)) - { - NVIC_ClearPendingIRQ(IRQn); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } -} - -__STATIC_INLINE uint32_t sd_nvic_SetPriority(IRQn_Type IRQn, uint32_t priority) -{ - if (!__sd_nvic_app_accessible_irq(IRQn)) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } - - if (!__sd_nvic_is_app_accessible_priority(priority)) - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED; - } - - NVIC_SetPriority(IRQn, (uint32_t)priority); - return NRF_SUCCESS; -} - -__STATIC_INLINE uint32_t sd_nvic_GetPriority(IRQn_Type IRQn, uint32_t * p_priority) -{ - if (__sd_nvic_app_accessible_irq(IRQn)) - { - *p_priority = (NVIC_GetPriority(IRQn) & 0xFF); - return NRF_SUCCESS; - } - else - { - return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE; - } -} - -__STATIC_INLINE uint32_t sd_nvic_SystemReset(void) -{ - NVIC_SystemReset(); - return NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN; -} - -__STATIC_INLINE uint32_t sd_nvic_critical_region_enter(uint8_t * p_is_nested_critical_region) -{ - int was_masked = __sd_nvic_irq_disable(); - if (!nrf_nvic_state.__cr_flag) - { - nrf_nvic_state.__cr_flag = 1; - nrf_nvic_state.__irq_masks[0] = ( NVIC->ICER[0] & __NRF_NVIC_APP_IRQS_0 ); - NVIC->ICER[0] = __NRF_NVIC_APP_IRQS_0; - nrf_nvic_state.__irq_masks[1] = ( NVIC->ICER[1] & __NRF_NVIC_APP_IRQS_1 ); - NVIC->ICER[1] = __NRF_NVIC_APP_IRQS_1; - *p_is_nested_critical_region = 0; - } - else - { - *p_is_nested_critical_region = 1; - } - if (!was_masked) - { - __sd_nvic_irq_enable(); - } - return NRF_SUCCESS; -} - -__STATIC_INLINE uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_critical_region) -{ - if (nrf_nvic_state.__cr_flag && (is_nested_critical_region == 0)) - { - int was_masked = __sd_nvic_irq_disable(); - NVIC->ISER[0] = nrf_nvic_state.__irq_masks[0]; - NVIC->ISER[1] = nrf_nvic_state.__irq_masks[1]; - nrf_nvic_state.__cr_flag = 0; - if (!was_masked) - { - __sd_nvic_irq_enable(); - } - } - - return NRF_SUCCESS; -} - -#endif /* SUPPRESS_INLINE_IMPLEMENTATION */ - -#ifdef __cplusplus -} -#endif - -#endif // NRF_NVIC_H__ - -/**@} */ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_sdm.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_sdm.h deleted file mode 100644 index c41d86d46b..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_sdm.h +++ /dev/null @@ -1,355 +0,0 @@ -/* - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above 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 Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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. - */ - -/** - @defgroup nrf_sdm_api SoftDevice Manager API - @{ - - @brief APIs for SoftDevice management. - -*/ - -#ifndef NRF_SDM_H__ -#define NRF_SDM_H__ - -#include "nrf_svc.h" -#include "nrf.h" -#include "nrf_soc.h" -#include "nrf_error_sdm.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** @addtogroup NRF_SDM_DEFINES Defines - * @{ */ -#ifdef NRFSOC_DOXYGEN -/// Declared in nrf_mbr.h -#define MBR_SIZE 0 -#warning test -#endif - -/** @brief The major version for the SoftDevice binary distributed with this header file. */ -#define SD_MAJOR_VERSION (5) - -/** @brief The minor version for the SoftDevice binary distributed with this header file. */ -#define SD_MINOR_VERSION (0) - -/** @brief The bugfix version for the SoftDevice binary distributed with this header file. */ -#define SD_BUGFIX_VERSION (0) - -/** @brief The full version number for the SoftDevice binary this header file was distributed - * with, as a decimal number in the form Mmmmbbb, where: - * - M is major version (one or more digits) - * - mmm is minor version (three digits) - * - bbb is bugfix version (three digits). */ -#define SD_VERSION (SD_MAJOR_VERSION * 1000000 + SD_MINOR_VERSION * 1000 + SD_BUGFIX_VERSION) - -/** @brief SoftDevice Manager SVC Base number. */ -#define SDM_SVC_BASE 0x10 - -/** @brief SoftDevice unique string size in bytes. */ -#define SD_UNIQUE_STR_SIZE 20 - -/** @brief Invalid info field. Returned when an info field does not exist. */ -#define SDM_INFO_FIELD_INVALID (0) - -/** @brief Defines the SoftDevice Information Structure location (address) as an offset from -the start of the SoftDevice (without MBR)*/ -#define SOFTDEVICE_INFO_STRUCT_OFFSET (0x2000) - -/** @brief Defines the absolute SoftDevice Information Structure location (address) when the - * SoftDevice is installed just above the MBR (the usual case). */ -#define SOFTDEVICE_INFO_STRUCT_ADDRESS (SOFTDEVICE_INFO_STRUCT_OFFSET + MBR_SIZE) - -/** @brief Defines the offset for the SoftDevice Information Structure size value relative to the - * SoftDevice base address. The size value is of type uint8_t. */ -#define SD_INFO_STRUCT_SIZE_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET) - -/** @brief Defines the offset for the SoftDevice size value relative to the SoftDevice base address. - * The size value is of type uint32_t. */ -#define SD_SIZE_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x08) - -/** @brief Defines the offset for FWID value relative to the SoftDevice base address. The FWID value - * is of type uint16_t. */ -#define SD_FWID_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x0C) - -/** @brief Defines the offset for the SoftDevice ID relative to the SoftDevice base address. The ID - * is of type uint32_t. */ -#define SD_ID_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x10) - -/** @brief Defines the offset for the SoftDevice version relative to the SoftDevice base address in - * the same format as @ref SD_VERSION, stored as an uint32_t. */ -#define SD_VERSION_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x14) - -/** @brief Defines the offset for the SoftDevice unique string relative to the SoftDevice base address. - * The SD_UNIQUE_STR is stored as an array of uint8_t. The size of array is @ref SD_UNIQUE_STR_SIZE. - */ -#define SD_UNIQUE_STR_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x18) - -/** @brief Defines a macro for retrieving the actual SoftDevice Information Structure size value - * from a given base address. Use @ref MBR_SIZE as the argument when the SoftDevice is - * installed just above the MBR (the usual case). */ -#define SD_INFO_STRUCT_SIZE_GET(baseaddr) (*((uint8_t *) ((baseaddr) + SD_INFO_STRUCT_SIZE_OFFSET))) - -/** @brief Defines a macro for retrieving the actual SoftDevice size value from a given base - * address. Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above - * the MBR (the usual case). */ -#define SD_SIZE_GET(baseaddr) (*((uint32_t *) ((baseaddr) + SD_SIZE_OFFSET))) - -/** @brief Defines a macro for retrieving the actual FWID value from a given base address. Use @ref - * MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the usual - * case). */ -#define SD_FWID_GET(baseaddr) (*((uint16_t *) ((baseaddr) + SD_FWID_OFFSET))) - -/** @brief Defines a macro for retrieving the actual SoftDevice ID from a given base address. Use - * @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the - * usual case). */ -#define SD_ID_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_ID_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ - ? (*((uint32_t *) ((baseaddr) + SD_ID_OFFSET))) : SDM_INFO_FIELD_INVALID) - -/** @brief Defines a macro for retrieving the actual SoftDevice version from a given base address. - * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR - * (the usual case). */ -#define SD_VERSION_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_VERSION_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ - ? (*((uint32_t *) ((baseaddr) + SD_VERSION_OFFSET))) : SDM_INFO_FIELD_INVALID) - -/** @brief Defines a macro for retrieving the address of SoftDevice unique str based on a given base address. - * Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR - * (the usual case). */ -#define SD_UNIQUE_STR_ADDR_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_UNIQUE_STR_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \ - ? (((uint8_t *) ((baseaddr) + SD_UNIQUE_STR_OFFSET))) : SDM_INFO_FIELD_INVALID) - -/**@defgroup NRF_FAULT_ID_RANGES Fault ID ranges - * @{ */ -#define NRF_FAULT_ID_SD_RANGE_START 0x00000000 /**< SoftDevice ID range start. */ -#define NRF_FAULT_ID_APP_RANGE_START 0x00001000 /**< Application ID range start. */ -/**@} */ - -/**@defgroup NRF_FAULT_IDS Fault ID types - * @{ */ -#define NRF_FAULT_ID_SD_ASSERT (NRF_FAULT_ID_SD_RANGE_START + 1) /**< SoftDevice assertion. The info parameter is reserved for future used. */ -#define NRF_FAULT_ID_APP_MEMACC (NRF_FAULT_ID_APP_RANGE_START + 1) /**< Application invalid memory access. The info parameter will contain 0x00000000, - in case of SoftDevice RAM access violation. In case of SoftDevice peripheral - register violation the info parameter will contain the sub-region number of - PREGION[0], on whose address range the disallowed write access caused the - memory access fault. */ -/**@} */ - -/** @} */ - -/** @addtogroup NRF_SDM_ENUMS Enumerations - * @{ */ - -/**@brief nRF SoftDevice Manager API SVC numbers. */ -enum NRF_SD_SVCS -{ - SD_SOFTDEVICE_ENABLE = SDM_SVC_BASE, /**< ::sd_softdevice_enable */ - SD_SOFTDEVICE_DISABLE, /**< ::sd_softdevice_disable */ - SD_SOFTDEVICE_IS_ENABLED, /**< ::sd_softdevice_is_enabled */ - SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, /**< ::sd_softdevice_vector_table_base_set */ - SVC_SDM_LAST /**< Placeholder for last SDM SVC */ -}; - -/** @} */ - -/** @addtogroup NRF_SDM_DEFINES Defines - * @{ */ - -/**@defgroup NRF_CLOCK_LF_ACCURACY Clock accuracy - * @{ */ - -#define NRF_CLOCK_LF_ACCURACY_250_PPM (0) /**< Default: 250 ppm */ -#define NRF_CLOCK_LF_ACCURACY_500_PPM (1) /**< 500 ppm */ -#define NRF_CLOCK_LF_ACCURACY_150_PPM (2) /**< 150 ppm */ -#define NRF_CLOCK_LF_ACCURACY_100_PPM (3) /**< 100 ppm */ -#define NRF_CLOCK_LF_ACCURACY_75_PPM (4) /**< 75 ppm */ -#define NRF_CLOCK_LF_ACCURACY_50_PPM (5) /**< 50 ppm */ -#define NRF_CLOCK_LF_ACCURACY_30_PPM (6) /**< 30 ppm */ -#define NRF_CLOCK_LF_ACCURACY_20_PPM (7) /**< 20 ppm */ -#define NRF_CLOCK_LF_ACCURACY_10_PPM (8) /**< 10 ppm */ -#define NRF_CLOCK_LF_ACCURACY_5_PPM (9) /**< 5 ppm */ -#define NRF_CLOCK_LF_ACCURACY_2_PPM (10) /**< 2 ppm */ -#define NRF_CLOCK_LF_ACCURACY_1_PPM (11) /**< 1 ppm */ - -/** @} */ - -/**@defgroup NRF_CLOCK_LF_SRC Possible LFCLK oscillator sources - * @{ */ - -#define NRF_CLOCK_LF_SRC_RC (0) /**< LFCLK RC oscillator. */ -#define NRF_CLOCK_LF_SRC_XTAL (1) /**< LFCLK crystal oscillator. */ -#define NRF_CLOCK_LF_SRC_SYNTH (2) /**< LFCLK Synthesized from HFCLK. */ - -/** @} */ - -/** @} */ - -/** @addtogroup NRF_SDM_TYPES Types - * @{ */ - -/**@brief Type representing LFCLK oscillator source. */ -typedef struct -{ - uint8_t source; /**< LF oscillator clock source, see @ref NRF_CLOCK_LF_SRC. */ - uint8_t rc_ctiv; /**< Only for NRF_CLOCK_LF_SRC_RC: Calibration timer interval in 1/4 second - units (nRF51: 1-64, nRF52: 1-32). - @note To avoid excessive clock drift, 0.5 degrees Celsius is the - maximum temperature change allowed in one calibration timer - interval. The interval should be selected to ensure this. - - @note Must be 0 if source is not NRF_CLOCK_LF_SRC_RC. */ - uint8_t rc_temp_ctiv; /**< Only for NRF_CLOCK_LF_SRC_RC: How often (in number of calibration - intervals) the RC oscillator shall be calibrated if the temperature - hasn't changed. - 0: Always calibrate even if the temperature hasn't changed. - 1: Only calibrate if the temperature has changed (nRF51 only). - 2-33: Check the temperature and only calibrate if it has changed, - however calibration will take place every rc_temp_ctiv - intervals in any case. - - @note Must be 0 if source is not NRF_CLOCK_LF_SRC_RC. - - @note For nRF52, the application must ensure calibration at least once - every 8 seconds to ensure +/-500 ppm clock stability. The - recommended configuration for NRF_CLOCK_LF_SRC_RC on nRF52 is - rc_ctiv=16 and rc_temp_ctiv=2. This will ensure calibration at - least once every 8 seconds and for temperature changes of 0.5 - degrees Celsius every 4 seconds. See the Product Specification - for the nRF52 device being used for more information.*/ - uint8_t accuracy; /**< External clock accuracy used in the LL to compute timing - windows, see @ref NRF_CLOCK_LF_ACCURACY.*/ -} nrf_clock_lf_cfg_t; - -/**@brief Fault Handler type. - * - * When certain unrecoverable errors occur within the application or SoftDevice the fault handler will be called back. - * The protocol stack will be in an undefined state when this happens and the only way to recover will be to - * perform a reset, using e.g. CMSIS NVIC_SystemReset(). - * If the application returns from the fault handler the SoftDevice will call NVIC_SystemReset(). - * - * @note This callback is executed in HardFault context, thus SVC functions cannot be called from the fault callback. - * - * @param[in] id Fault identifier. See @ref NRF_FAULT_IDS. - * @param[in] pc The program counter of the instruction that triggered the fault. - * @param[in] info Optional additional information regarding the fault. Refer to each Fault identifier for details. - * - * @note When id is set to NRF_FAULT_ID_APP_MEMACC, pc will contain the address of the instruction being executed at the time when - * the fault is detected by the CPU. The CPU program counter may have advanced up to 2 instructions (no branching) after the one that triggered the fault. - */ -typedef void (*nrf_fault_handler_t)(uint32_t id, uint32_t pc, uint32_t info); - -/** @} */ - -/** @addtogroup NRF_SDM_FUNCTIONS Functions - * @{ */ - -/**@brief Enables the SoftDevice and by extension the protocol stack. - * - * @note Some care must be taken if a low frequency clock source is already running when calling this function: - * If the LF clock has a different source then the one currently running, it will be stopped. Then, the new - * clock source will be started. - * - * @note This function has no effect when returning with an error. - * - * @post If return code is ::NRF_SUCCESS - * - SoC library and protocol stack APIs are made available. - * - A portion of RAM will be unavailable (see relevant SDS documentation). - * - Some peripherals will be unavailable or available only through the SoC API (see relevant SDS documentation). - * - Interrupts will not arrive from protected peripherals or interrupts. - * - nrf_nvic_ functions must be used instead of CMSIS NVIC_ functions for reliable usage of the SoftDevice. - * - Interrupt latency may be affected by the SoftDevice (see relevant SDS documentation). - * - Chosen low frequency clock source will be running. - * - * @param p_clock_lf_cfg Low frequency clock source and accuracy. - If NULL the clock will be configured as an RC source with rc_ctiv = 16 and .rc_temp_ctiv = 2 - In the case of XTAL source, the PPM accuracy of the chosen clock source must be greater than or equal to the actual characteristics of your XTAL clock. - * @param fault_handler Callback to be invoked in case of fault, cannot be NULL. - * - * @retval ::NRF_SUCCESS - * @retval ::NRF_ERROR_INVALID_ADDR Invalid or NULL pointer supplied. - * @retval ::NRF_ERROR_INVALID_STATE SoftDevice is already enabled, and the clock source and fault handler cannot be updated. - * @retval ::NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION SoftDevice interrupt is already enabled, or an enabled interrupt has an illegal priority level. - * @retval ::NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN Unknown low frequency clock source selected. - */ -SVCALL(SD_SOFTDEVICE_ENABLE, uint32_t, sd_softdevice_enable(nrf_clock_lf_cfg_t const * p_clock_lf_cfg, nrf_fault_handler_t fault_handler)); - - -/**@brief Disables the SoftDevice and by extension the protocol stack. - * - * Idempotent function to disable the SoftDevice. - * - * @post SoC library and protocol stack APIs are made unavailable. - * @post All interrupts that was protected by the SoftDevice will be disabled and initialized to priority 0 (highest). - * @post All peripherals used by the SoftDevice will be reset to default values. - * @post All of RAM become available. - * @post All interrupts are forwarded to the application. - * @post LFCLK source chosen in ::sd_softdevice_enable will be left running. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_SOFTDEVICE_DISABLE, uint32_t, sd_softdevice_disable(void)); - -/**@brief Check if the SoftDevice is enabled. - * - * @param[out] p_softdevice_enabled If the SoftDevice is enabled: 1 else 0. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_SOFTDEVICE_IS_ENABLED, uint32_t, sd_softdevice_is_enabled(uint8_t * p_softdevice_enabled)); - -/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the SoftDevice - * - * This function is only intended to be called when a bootloader is enabled. - * - * @param[in] address The base address of the interrupt vector table for forwarded interrupts. - - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, uint32_t, sd_softdevice_vector_table_base_set(uint32_t address)); - -/** @} */ - -#ifdef __cplusplus -} -#endif -#endif // NRF_SDM_H__ - -/** - @} -*/ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_soc.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_soc.h deleted file mode 100644 index d7d3c801b8..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_soc.h +++ /dev/null @@ -1,931 +0,0 @@ -/* - * Copyright (c) 2015 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above 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 Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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. - */ - -/** - * @defgroup nrf_soc_api SoC Library API - * @{ - * - * @brief APIs for the SoC library. - * - */ - -#ifndef NRF_SOC_H__ -#define NRF_SOC_H__ - -#include -#include -#include "nrf_svc.h" -#include "nrf.h" - -#include "nrf_error_soc.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**@addtogroup NRF_SOC_DEFINES Defines - * @{ */ - -/**@brief The number of the lowest SVC number reserved for the SoC library. */ -#define SOC_SVC_BASE (0x20) /**< Base value for SVCs that are available when the SoftDevice is disabled. */ -#define SOC_SVC_BASE_NOT_AVAILABLE (0x2B) /**< Base value for SVCs that are not available when the SoftDevice is disabled. */ - -/**@brief Guaranteed time for application to process radio inactive notification. */ -#define NRF_RADIO_NOTIFICATION_INACTIVE_GUARANTEED_TIME_US (62) - -/**@brief The minimum allowed timeslot extension time. */ -#define NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US (200) - -/**@brief The maximum processing time to handle a timeslot extension. */ -#define NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US (17) - -/**@brief The latest time before the end of a timeslot the timeslot can be extended. */ -#define NRF_RADIO_MIN_EXTENSION_MARGIN_US (79) - -#define SOC_ECB_KEY_LENGTH (16) /**< ECB key length. */ -#define SOC_ECB_CLEARTEXT_LENGTH (16) /**< ECB cleartext length. */ -#define SOC_ECB_CIPHERTEXT_LENGTH (SOC_ECB_CLEARTEXT_LENGTH) /**< ECB ciphertext length. */ - -#define SD_EVT_IRQn (SWI2_EGU2_IRQn) /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */ -#define SD_EVT_IRQHandler (SWI2_EGU2_IRQHandler) /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events. - The default interrupt priority for this handler is set to 4 */ -#define RADIO_NOTIFICATION_IRQn (SWI1_EGU1_IRQn) /**< The radio notification IRQ number. */ -#define RADIO_NOTIFICATION_IRQHandler (SWI1_EGU1_IRQHandler) /**< The radio notification IRQ handler. - The default interrupt priority for this handler is set to 4 */ -#define NRF_RADIO_LENGTH_MIN_US (100) /**< The shortest allowed radio timeslot, in microseconds. */ -#define NRF_RADIO_LENGTH_MAX_US (100000) /**< The longest allowed radio timeslot, in microseconds. */ - -#define NRF_RADIO_DISTANCE_MAX_US (128000000UL - 1UL) /**< The longest timeslot distance, in microseconds, allowed for the distance parameter (see @ref nrf_radio_request_normal_t) in the request. */ - -#define NRF_RADIO_EARLIEST_TIMEOUT_MAX_US (128000000UL - 1UL) /**< The longest timeout, in microseconds, allowed when requesting the earliest possible timeslot. */ - -#define NRF_RADIO_START_JITTER_US (2) /**< The maximum jitter in @ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START relative to the requested start time. */ - -/**@} */ - -/**@addtogroup NRF_SOC_ENUMS Enumerations - * @{ */ - -/**@brief The SVC numbers used by the SVC functions in the SoC library. */ -enum NRF_SOC_SVCS -{ - SD_PPI_CHANNEL_ENABLE_GET = SOC_SVC_BASE, - SD_PPI_CHANNEL_ENABLE_SET, - SD_PPI_CHANNEL_ENABLE_CLR, - SD_PPI_CHANNEL_ASSIGN, - SD_PPI_GROUP_TASK_ENABLE, - SD_PPI_GROUP_TASK_DISABLE, - SD_PPI_GROUP_ASSIGN, - SD_PPI_GROUP_GET, - SD_FLASH_PAGE_ERASE, - SD_FLASH_WRITE, - SD_FLASH_PROTECT, - SD_MUTEX_NEW = SOC_SVC_BASE_NOT_AVAILABLE, - SD_MUTEX_ACQUIRE, - SD_MUTEX_RELEASE, - SD_RAND_APPLICATION_POOL_CAPACITY_GET, - SD_RAND_APPLICATION_BYTES_AVAILABLE_GET, - SD_RAND_APPLICATION_VECTOR_GET, - SD_POWER_MODE_SET, - SD_POWER_SYSTEM_OFF, - SD_POWER_RESET_REASON_GET, - SD_POWER_RESET_REASON_CLR, - SD_POWER_POF_ENABLE, - SD_POWER_POF_THRESHOLD_SET, - SD_POWER_RAM_POWER_SET, - SD_POWER_RAM_POWER_CLR, - SD_POWER_RAM_POWER_GET, - SD_POWER_GPREGRET_SET, - SD_POWER_GPREGRET_CLR, - SD_POWER_GPREGRET_GET, - SD_POWER_DCDC_MODE_SET, - SD_APP_EVT_WAIT, - SD_CLOCK_HFCLK_REQUEST, - SD_CLOCK_HFCLK_RELEASE, - SD_CLOCK_HFCLK_IS_RUNNING, - SD_RADIO_NOTIFICATION_CFG_SET, - SD_ECB_BLOCK_ENCRYPT, - SD_ECB_BLOCKS_ENCRYPT, - SD_RADIO_SESSION_OPEN, - SD_RADIO_SESSION_CLOSE, - SD_RADIO_REQUEST, - SD_EVT_GET, - SD_TEMP_GET, - SVC_SOC_LAST -}; - -/**@brief Possible values of a ::nrf_mutex_t. */ -enum NRF_MUTEX_VALUES -{ - NRF_MUTEX_FREE, - NRF_MUTEX_TAKEN -}; - -/**@brief Power modes. */ -enum NRF_POWER_MODES -{ - NRF_POWER_MODE_CONSTLAT, /**< Constant latency mode. See power management in the reference manual. */ - NRF_POWER_MODE_LOWPWR /**< Low power mode. See power management in the reference manual. */ -}; - - -/**@brief Power failure thresholds */ -enum NRF_POWER_THRESHOLDS -{ - NRF_POWER_THRESHOLD_V17 = 4UL, /**< 1.7 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V18, /**< 1.8 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V19, /**< 1.9 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V20, /**< 2.0 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V21, /**< 2.1 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V22, /**< 2.2 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V23, /**< 2.3 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V24, /**< 2.4 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V25, /**< 2.5 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V26, /**< 2.6 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V27, /**< 2.7 Volts power failure threshold. */ - NRF_POWER_THRESHOLD_V28 /**< 2.8 Volts power failure threshold. */ -}; - - -/**@brief DC/DC converter modes. */ -enum NRF_POWER_DCDC_MODES -{ - NRF_POWER_DCDC_DISABLE, /**< The DCDC is disabled. */ - NRF_POWER_DCDC_ENABLE /**< The DCDC is enabled. */ -}; - -/**@brief Radio notification distances. */ -enum NRF_RADIO_NOTIFICATION_DISTANCES -{ - NRF_RADIO_NOTIFICATION_DISTANCE_NONE = 0, /**< The event does not have a notification. */ - NRF_RADIO_NOTIFICATION_DISTANCE_800US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_1740US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_2680US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_3620US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_4560US, /**< The distance from the active notification to start of radio activity. */ - NRF_RADIO_NOTIFICATION_DISTANCE_5500US /**< The distance from the active notification to start of radio activity. */ -}; - - -/**@brief Radio notification types. */ -enum NRF_RADIO_NOTIFICATION_TYPES -{ - NRF_RADIO_NOTIFICATION_TYPE_NONE = 0, /**< The event does not have a radio notification signal. */ - NRF_RADIO_NOTIFICATION_TYPE_INT_ON_ACTIVE, /**< Using interrupt for notification when the radio will be enabled. */ - NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE, /**< Using interrupt for notification when the radio has been disabled. */ - NRF_RADIO_NOTIFICATION_TYPE_INT_ON_BOTH, /**< Using interrupt for notification both when the radio will be enabled and disabled. */ -}; - -/**@brief The Radio signal callback types. */ -enum NRF_RADIO_CALLBACK_SIGNAL_TYPE -{ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_START, /**< This signal indicates the start of the radio timeslot. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0, /**< This signal indicates the NRF_TIMER0 interrupt. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO, /**< This signal indicates the NRF_RADIO interrupt. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_FAILED, /**< This signal indicates extend action failed. */ - NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_SUCCEEDED /**< This signal indicates extend action succeeded. */ -}; - -/**@brief The actions requested by the signal callback. - * - * This code gives the SOC instructions about what action to take when the signal callback has - * returned. - */ -enum NRF_RADIO_SIGNAL_CALLBACK_ACTION -{ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_NONE, /**< Return without action. */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND, /**< Request an extension of the current - timeslot. Maximum execution time for this action: - @ref NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US. - This action must be started at least @ref - NRF_RADIO_MIN_EXTENSION_MARGIN_US before - the end of the timeslot. */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_END, /**< End the current radio timeslot. */ - NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END /**< Request a new radio timeslot and end the current timeslot. */ -}; - -/**@brief Radio timeslot high frequency clock source configuration. */ -enum NRF_RADIO_HFCLK_CFG -{ - NRF_RADIO_HFCLK_CFG_XTAL_GUARANTEED, /**< The SoftDevice will guarantee that the high frequency clock source is the - external crystal for the whole duration of the timeslot. This should be the - preferred option for events that use the radio or require high timing accuracy. - @note The SoftDevice will automatically turn on and off the external crystal, - at the beginning and end of the timeslot, respectively. The crystal may also - intentionally be left running after the timeslot, in cases where it is needed - by the SoftDevice shortly after the end of the timeslot. */ - NRF_RADIO_HFCLK_CFG_NO_GUARANTEE /**< This configuration allows for earlier and tighter scheduling of timeslots. - The RC oscillator may be the clock source in part or for the whole duration of the timeslot. - The RC oscillator's accuracy must therefore be taken into consideration. - @note If the application will use the radio peripheral in timeslots with this configuration, - it must make sure that the crystal is running and stable before starting the radio. */ -}; - -/**@brief Radio timeslot priorities. */ -enum NRF_RADIO_PRIORITY -{ - NRF_RADIO_PRIORITY_HIGH, /**< High (equal priority as the normal connection priority of the SoftDevice stack(s)). */ - NRF_RADIO_PRIORITY_NORMAL, /**< Normal (equal priority as the priority of secondary activities of the SoftDevice stack(s)). */ -}; - -/**@brief Radio timeslot request type. */ -enum NRF_RADIO_REQUEST_TYPE -{ - NRF_RADIO_REQ_TYPE_EARLIEST, /**< Request radio timeslot as early as possible. This should always be used for the first request in a session. */ - NRF_RADIO_REQ_TYPE_NORMAL /**< Normal radio timeslot request. */ -}; - -/**@brief SoC Events. */ -enum NRF_SOC_EVTS -{ - NRF_EVT_HFCLKSTARTED, /**< Event indicating that the HFCLK has started. */ - NRF_EVT_POWER_FAILURE_WARNING, /**< Event indicating that a power failure warning has occurred. */ - NRF_EVT_FLASH_OPERATION_SUCCESS, /**< Event indicating that the ongoing flash operation has completed successfully. */ - NRF_EVT_FLASH_OPERATION_ERROR, /**< Event indicating that the ongoing flash operation has timed out with an error. */ - NRF_EVT_RADIO_BLOCKED, /**< Event indicating that a radio timeslot was blocked. */ - NRF_EVT_RADIO_CANCELED, /**< Event indicating that a radio timeslot was canceled by SoftDevice. */ - NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN, /**< Event indicating that a radio timeslot signal callback handler return was invalid. */ - NRF_EVT_RADIO_SESSION_IDLE, /**< Event indicating that a radio timeslot session is idle. */ - NRF_EVT_RADIO_SESSION_CLOSED, /**< Event indicating that a radio timeslot session is closed. */ - NRF_EVT_NUMBER_OF_EVTS -}; - -/**@} */ - - -/**@addtogroup NRF_SOC_STRUCTURES Structures - * @{ */ - -/**@brief Represents a mutex for use with the nrf_mutex functions. - * @note Accessing the value directly is not safe, use the mutex functions! - */ -typedef volatile uint8_t nrf_mutex_t; - -/**@brief Parameters for a request for a timeslot as early as possible. */ -typedef struct -{ - uint8_t hfclk; /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */ - uint8_t priority; /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */ - uint32_t length_us; /**< The radio timeslot length (in the range 100 to 100,000] microseconds). */ - uint32_t timeout_us; /**< Longest acceptable delay until the start of the requested timeslot (up to @ref NRF_RADIO_EARLIEST_TIMEOUT_MAX_US microseconds). */ -} nrf_radio_request_earliest_t; - -/**@brief Parameters for a normal radio timeslot request. */ -typedef struct -{ - uint8_t hfclk; /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */ - uint8_t priority; /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */ - uint32_t distance_us; /**< Distance from the start of the previous radio timeslot (up to @ref NRF_RADIO_DISTANCE_MAX_US microseconds). */ - uint32_t length_us; /**< The radio timeslot length (in the range [100..100,000] microseconds). */ -} nrf_radio_request_normal_t; - -/**@brief Radio timeslot request parameters. */ -typedef struct -{ - uint8_t request_type; /**< Type of request, see @ref NRF_RADIO_REQUEST_TYPE. */ - union - { - nrf_radio_request_earliest_t earliest; /**< Parameters for requesting a radio timeslot as early as possible. */ - nrf_radio_request_normal_t normal; /**< Parameters for requesting a normal radio timeslot. */ - } params; /**< Parameter union. */ -} nrf_radio_request_t; - -/**@brief Return parameters of the radio timeslot signal callback. */ -typedef struct -{ - uint8_t callback_action; /**< The action requested by the application when returning from the signal callback, see @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION. */ - union - { - struct - { - nrf_radio_request_t * p_next; /**< The request parameters for the next radio timeslot. */ - } request; /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END. */ - struct - { - uint32_t length_us; /**< Requested extension of the radio timeslot duration (microseconds) (for minimum time see @ref NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US). */ - } extend; /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND. */ - } params; /**< Parameter union. */ -} nrf_radio_signal_callback_return_param_t; - -/**@brief The radio timeslot signal callback type. - * - * @note In case of invalid return parameters, the radio timeslot will automatically end - * immediately after returning from the signal callback and the - * @ref NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN event will be sent. - * @note The returned struct pointer must remain valid after the signal callback - * function returns. For instance, this means that it must not point to a stack variable. - * - * @param[in] signal_type Type of signal, see @ref NRF_RADIO_CALLBACK_SIGNAL_TYPE. - * - * @return Pointer to structure containing action requested by the application. - */ -typedef nrf_radio_signal_callback_return_param_t * (*nrf_radio_signal_callback_t) (uint8_t signal_type); - -/**@brief AES ECB parameter typedefs */ -typedef uint8_t soc_ecb_key_t[SOC_ECB_KEY_LENGTH]; /**< Encryption key type. */ -typedef uint8_t soc_ecb_cleartext_t[SOC_ECB_CLEARTEXT_LENGTH]; /**< Cleartext data type. */ -typedef uint8_t soc_ecb_ciphertext_t[SOC_ECB_CIPHERTEXT_LENGTH]; /**< Ciphertext data type. */ - -/**@brief AES ECB data structure */ -typedef struct -{ - soc_ecb_key_t key; /**< Encryption key. */ - soc_ecb_cleartext_t cleartext; /**< Cleartext data. */ - soc_ecb_ciphertext_t ciphertext; /**< Ciphertext data. */ -} nrf_ecb_hal_data_t; - -/**@brief AES ECB block. Used to provide multiple blocks in a single call - to @ref sd_ecb_blocks_encrypt.*/ -typedef struct -{ - soc_ecb_key_t const * p_key; /**< Pointer to the Encryption key. */ - soc_ecb_cleartext_t const * p_cleartext; /**< Pointer to the Cleartext data. */ - soc_ecb_ciphertext_t * p_ciphertext; /**< Pointer to the Ciphertext data. */ -} nrf_ecb_hal_data_block_t; - -/**@} */ - -/**@addtogroup NRF_SOC_FUNCTIONS Functions - * @{ */ - -/**@brief Initialize a mutex. - * - * @param[in] p_mutex Pointer to the mutex to initialize. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_MUTEX_NEW, uint32_t, sd_mutex_new(nrf_mutex_t * p_mutex)); - -/**@brief Attempt to acquire a mutex. - * - * @param[in] p_mutex Pointer to the mutex to acquire. - * - * @retval ::NRF_SUCCESS The mutex was successfully acquired. - * @retval ::NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN The mutex could not be acquired. - */ -SVCALL(SD_MUTEX_ACQUIRE, uint32_t, sd_mutex_acquire(nrf_mutex_t * p_mutex)); - -/**@brief Release a mutex. - * - * @param[in] p_mutex Pointer to the mutex to release. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_MUTEX_RELEASE, uint32_t, sd_mutex_release(nrf_mutex_t * p_mutex)); - -/**@brief Query the capacity of the application random pool. - * - * @param[out] p_pool_capacity The capacity of the pool. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_RAND_APPLICATION_POOL_CAPACITY_GET, uint32_t, sd_rand_application_pool_capacity_get(uint8_t * p_pool_capacity)); - -/**@brief Get number of random bytes available to the application. - * - * @param[out] p_bytes_available The number of bytes currently available in the pool. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_RAND_APPLICATION_BYTES_AVAILABLE_GET, uint32_t, sd_rand_application_bytes_available_get(uint8_t * p_bytes_available)); - -/**@brief Get random bytes from the application pool. - * - * @param[out] p_buff Pointer to unit8_t buffer for storing the bytes. - * @param[in] length Number of bytes to take from pool and place in p_buff. - * - * @retval ::NRF_SUCCESS The requested bytes were written to p_buff. - * @retval ::NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES No bytes were written to the buffer, because there were not enough bytes available. -*/ -SVCALL(SD_RAND_APPLICATION_VECTOR_GET, uint32_t, sd_rand_application_vector_get(uint8_t * p_buff, uint8_t length)); - -/**@brief Gets the reset reason register. - * - * @param[out] p_reset_reason Contents of the NRF_POWER->RESETREAS register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RESET_REASON_GET, uint32_t, sd_power_reset_reason_get(uint32_t * p_reset_reason)); - -/**@brief Clears the bits of the reset reason register. - * - * @param[in] reset_reason_clr_msk Contains the bits to clear from the reset reason register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RESET_REASON_CLR, uint32_t, sd_power_reset_reason_clr(uint32_t reset_reason_clr_msk)); - -/**@brief Sets the power mode when in CPU sleep. - * - * @param[in] power_mode The power mode to use when in CPU sleep, see @ref NRF_POWER_MODES. @sa sd_app_evt_wait - * - * @retval ::NRF_SUCCESS The power mode was set. - * @retval ::NRF_ERROR_SOC_POWER_MODE_UNKNOWN The power mode was unknown. - */ -SVCALL(SD_POWER_MODE_SET, uint32_t, sd_power_mode_set(uint8_t power_mode)); - -/**@brief Puts the chip in System OFF mode. - * - * @retval ::NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN - */ -SVCALL(SD_POWER_SYSTEM_OFF, uint32_t, sd_power_system_off(void)); - -/**@brief Enables or disables the power-fail comparator. - * - * Enabling this will give a SoftDevice event (NRF_EVT_POWER_FAILURE_WARNING) when the power failure warning occurs. - * The event can be retrieved with sd_evt_get(); - * - * @param[in] pof_enable True if the power-fail comparator should be enabled, false if it should be disabled. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_POF_ENABLE, uint32_t, sd_power_pof_enable(uint8_t pof_enable)); - -/**@brief Sets the power-fail threshold value. - * - * @param[in] threshold The power-fail threshold value to use, see @ref NRF_POWER_THRESHOLDS. - * - * @retval ::NRF_SUCCESS The power failure threshold was set. - * @retval ::NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN The power failure threshold is unknown. - */ -SVCALL(SD_POWER_POF_THRESHOLD_SET, uint32_t, sd_power_pof_threshold_set(uint8_t threshold)); - -/**@brief Writes the NRF_POWER->RAM[index].POWERSET register. - * - * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERSET register to write to. - * @param[in] ram_powerset Contains the word to write to the NRF_POWER->RAM[index].POWERSET register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RAM_POWER_SET, uint32_t, sd_power_ram_power_set(uint8_t index, uint32_t ram_powerset)); - -/**@brief Writes the NRF_POWER->RAM[index].POWERCLR register. - * - * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERCLR register to write to. - * @param[in] ram_powerclr Contains the word to write to the NRF_POWER->RAM[index].POWERCLR register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RAM_POWER_CLR, uint32_t, sd_power_ram_power_clr(uint8_t index, uint32_t ram_powerclr)); - -/**@brief Get contents of NRF_POWER->RAM[index].POWER register, indicates power status of RAM[index] blocks. - * - * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWER register to read from. - * @param[out] p_ram_power Content of NRF_POWER->RAM[index].POWER register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_RAM_POWER_GET, uint32_t, sd_power_ram_power_get(uint8_t index, uint32_t * p_ram_power)); - -/**@brief Set bits in the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[in] gpregret_msk Bits to be set in the GPREGRET register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_GPREGRET_SET, uint32_t, sd_power_gpregret_set(uint32_t gpregret_id, uint32_t gpregret_msk)); - -/**@brief Clear bits in the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[in] gpregret_msk Bits to be clear in the GPREGRET register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_GPREGRET_CLR, uint32_t, sd_power_gpregret_clr(uint32_t gpregret_id, uint32_t gpregret_msk)); - -/**@brief Get contents of the general purpose retention registers (NRF_POWER->GPREGRET*). - * - * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2. - * @param[out] p_gpregret Contents of the GPREGRET register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t gpregret_id, uint32_t *p_gpregret)); - -/**@brief Sets the DCDC mode. - * - * Enable or disable the DCDC peripheral. - * - * @param[in] dcdc_mode The mode of the DCDC, see @ref NRF_POWER_DCDC_MODES. - * - * @retval ::NRF_SUCCESS - * @retval ::NRF_ERROR_INVALID_PARAM The DCDC mode is invalid. - */ -SVCALL(SD_POWER_DCDC_MODE_SET, uint32_t, sd_power_dcdc_mode_set(uint8_t dcdc_mode)); - -/**@brief Request the high frequency crystal oscillator. - * - * Will start the high frequency crystal oscillator, the startup time of the crystal varies - * and the ::sd_clock_hfclk_is_running function can be polled to check if it has started. - * - * @see sd_clock_hfclk_is_running - * @see sd_clock_hfclk_release - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_CLOCK_HFCLK_REQUEST, uint32_t, sd_clock_hfclk_request(void)); - -/**@brief Releases the high frequency crystal oscillator. - * - * Will stop the high frequency crystal oscillator, this happens immediately. - * - * @see sd_clock_hfclk_is_running - * @see sd_clock_hfclk_request - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_CLOCK_HFCLK_RELEASE, uint32_t, sd_clock_hfclk_release(void)); - -/**@brief Checks if the high frequency crystal oscillator is running. - * - * @see sd_clock_hfclk_request - * @see sd_clock_hfclk_release - * - * @param[out] p_is_running 1 if the external crystal oscillator is running, 0 if not. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_CLOCK_HFCLK_IS_RUNNING, uint32_t, sd_clock_hfclk_is_running(uint32_t * p_is_running)); - -/**@brief Waits for an application event. - * - * An application event is either an application interrupt or a pended interrupt when the interrupt - * is disabled. - * - * When the application waits for an application event by calling this function, an interrupt that - * is enabled will be taken immediately on pending since this function will wait in thread mode, - * then the execution will return in the application's main thread. - * - * In order to wake up from disabled interrupts, the SEVONPEND flag has to be set in the Cortex-M - * MCU's System Control Register (SCR), CMSIS_SCB. In that case, when a disabled interrupt gets - * pended, this function will return to the application's main thread. - * - * @note The application must ensure that the pended flag is cleared using ::sd_nvic_ClearPendingIRQ - * in order to sleep using this function. This is only necessary for disabled interrupts, as - * the interrupt handler will clear the pending flag automatically for enabled interrupts. - * - * @note If an application interrupt has happened since the last time sd_app_evt_wait was - * called this function will return immediately and not go to sleep. This is to avoid race - * conditions that can occur when a flag is updated in the interrupt handler and processed - * in the main loop. - * - * @post An application interrupt has happened or a interrupt pending flag is set. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_APP_EVT_WAIT, uint32_t, sd_app_evt_wait(void)); - -/**@brief Get PPI channel enable register contents. - * - * @param[out] p_channel_enable The contents of the PPI CHEN register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ENABLE_GET, uint32_t, sd_ppi_channel_enable_get(uint32_t * p_channel_enable)); - -/**@brief Set PPI channel enable register. - * - * @param[in] channel_enable_set_msk Mask containing the bits to set in the PPI CHEN register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ENABLE_SET, uint32_t, sd_ppi_channel_enable_set(uint32_t channel_enable_set_msk)); - -/**@brief Clear PPI channel enable register. - * - * @param[in] channel_enable_clr_msk Mask containing the bits to clear in the PPI CHEN register. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ENABLE_CLR, uint32_t, sd_ppi_channel_enable_clr(uint32_t channel_enable_clr_msk)); - -/**@brief Assign endpoints to a PPI channel. - * - * @param[in] channel_num Number of the PPI channel to assign. - * @param[in] evt_endpoint Event endpoint of the PPI channel. - * @param[in] task_endpoint Task endpoint of the PPI channel. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_CHANNEL The channel number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_CHANNEL_ASSIGN, uint32_t, sd_ppi_channel_assign(uint8_t channel_num, const volatile void * evt_endpoint, const volatile void * task_endpoint)); - -/**@brief Task to enable a channel group. - * - * @param[in] group_num Number of the channel group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_TASK_ENABLE, uint32_t, sd_ppi_group_task_enable(uint8_t group_num)); - -/**@brief Task to disable a channel group. - * - * @param[in] group_num Number of the PPI group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_TASK_DISABLE, uint32_t, sd_ppi_group_task_disable(uint8_t group_num)); - -/**@brief Assign PPI channels to a channel group. - * - * @param[in] group_num Number of the channel group. - * @param[in] channel_msk Mask of the channels to assign to the group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_ASSIGN, uint32_t, sd_ppi_group_assign(uint8_t group_num, uint32_t channel_msk)); - -/**@brief Gets the PPI channels of a channel group. - * - * @param[in] group_num Number of the channel group. - * @param[out] p_channel_msk Mask of the channels assigned to the group. - * - * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_PPI_GROUP_GET, uint32_t, sd_ppi_group_get(uint8_t group_num, uint32_t * p_channel_msk)); - -/**@brief Configures the Radio Notification signal. - * - * @note - * - The notification signal latency depends on the interrupt priority settings of SWI used - * for notification signal. - * - To ensure that the radio notification signal behaves in a consistent way, the radio - * notifications must be configured when there is no protocol stack or other SoftDevice - * activity in progress. It is recommended that the radio notification signal is - * configured directly after the SoftDevice has been enabled. - * - In the period between the ACTIVE signal and the start of the Radio Event, the SoftDevice - * will interrupt the application to do Radio Event preparation. - * - Using the Radio Notification feature may limit the bandwidth, as the SoftDevice may have - * to shorten the connection events to have time for the Radio Notification signals. - * - * @param[in] type Type of notification signal, see @ref NRF_RADIO_NOTIFICATION_TYPES. - * @ref NRF_RADIO_NOTIFICATION_TYPE_NONE shall be used to turn off radio - * notification. Using @ref NRF_RADIO_NOTIFICATION_DISTANCE_NONE is - * recommended (but not required) to be used with - * @ref NRF_RADIO_NOTIFICATION_TYPE_NONE. - * - * @param[in] distance Distance between the notification signal and start of radio activity, see @ref NRF_RADIO_NOTIFICATION_DISTANCES. - * This parameter is ignored when @ref NRF_RADIO_NOTIFICATION_TYPE_NONE or - * @ref NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE is used. - * - * @retval ::NRF_ERROR_INVALID_PARAM The group number is invalid. - * @retval ::NRF_ERROR_INVALID_STATE A protocol stack or other SoftDevice is running. Stop all - * running activities and retry. - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_RADIO_NOTIFICATION_CFG_SET, uint32_t, sd_radio_notification_cfg_set(uint8_t type, uint8_t distance)); - -/**@brief Encrypts a block according to the specified parameters. - * - * 128-bit AES encryption. - * - * @note: - * - The application may set the SEVONPEND bit in the SCR to 1 to make the SoftDevice sleep while - * the ECB is running. The SEVONPEND bit should only be cleared (set to 0) from application - * main or low interrupt level. - * - * @param[in, out] p_ecb_data Pointer to the ECB parameters' struct (two input - * parameters and one output parameter). - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_ECB_BLOCK_ENCRYPT, uint32_t, sd_ecb_block_encrypt(nrf_ecb_hal_data_t * p_ecb_data)); - -/**@brief Encrypts multiple data blocks provided as an array of data block structures. - * - * @details: Performs 128-bit AES encryption on multiple data blocks - * - * @note: - * - The application may set the SEVONPEND bit in the SCR to 1 to make the SoftDevice sleep while - * the ECB is running. The SEVONPEND bit should only be cleared (set to 0) from application - * main or low interrupt level. - * - * @param[in] block_count Count of blocks in the p_data_blocks array. - * @param[in,out] p_data_blocks Pointer to the first entry in a contiguous array of - * @ref nrf_ecb_hal_data_block_t structures. - * - * @retval ::NRF_SUCCESS - */ -SVCALL(SD_ECB_BLOCKS_ENCRYPT, uint32_t, sd_ecb_blocks_encrypt(uint8_t block_count, nrf_ecb_hal_data_block_t * p_data_blocks)); - -/**@brief Gets any pending events generated by the SoC API. - * - * The application should keep calling this function to get events, until ::NRF_ERROR_NOT_FOUND is returned. - * - * @param[out] p_evt_id Set to one of the values in @ref NRF_SOC_EVTS, if any events are pending. - * - * @retval ::NRF_SUCCESS An event was pending. The event id is written in the p_evt_id parameter. - * @retval ::NRF_ERROR_NOT_FOUND No pending events. - */ -SVCALL(SD_EVT_GET, uint32_t, sd_evt_get(uint32_t * p_evt_id)); - -/**@brief Get the temperature measured on the chip - * - * This function will block until the temperature measurement is done. - * It takes around 50 us from call to return. - * - * @param[out] p_temp Result of temperature measurement. Die temperature in 0.25 degrees Celsius. - * - * @retval ::NRF_SUCCESS A temperature measurement was done, and the temperature was written to temp - */ -SVCALL(SD_TEMP_GET, uint32_t, sd_temp_get(int32_t * p_temp)); - -/**@brief Flash Write -* -* Commands to write a buffer to flash -* -* If the SoftDevice is enabled: -* This call initiates the flash access command, and its completion will be communicated to the -* application with exactly one of the following events: -* - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. -* - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. -* -* If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the - * write has been completed -* -* @note -* - This call takes control over the radio and the CPU during flash erase and write to make sure that -* they will not interfere with the flash access. This means that all interrupts will be blocked -* for a predictable time (depending on the NVMC specification in the device's Product Specification -* and the command parameters). -* - The data in the p_src buffer should not be modified before the @ref NRF_EVT_FLASH_OPERATION_SUCCESS -* or the @ref NRF_EVT_FLASH_OPERATION_ERROR have been received if the SoftDevice is enabled. -* -* -* @param[in] p_dst Pointer to start of flash location to be written. -* @param[in] p_src Pointer to buffer with data to be written. -* @param[in] size Number of 32-bit words to write. Maximum size is the number of words in one -* flash page. See the device's Product Specification for details. -* -* @retval ::NRF_ERROR_INVALID_ADDR Tried to write to a non existing flash address, or p_dst or p_src was unaligned. -* @retval ::NRF_ERROR_BUSY The previous command has not yet completed. -* @retval ::NRF_ERROR_INVALID_LENGTH Size was 0, or higher than the maximum allowed size. -* @retval ::NRF_ERROR_FORBIDDEN Tried to write to or read from protected location. -* @retval ::NRF_SUCCESS The command was accepted. -*/ -SVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * p_src, uint32_t size)); - - -/**@brief Flash Erase page -* -* Commands to erase a flash page -* If the SoftDevice is enabled: -* This call initiates the flash access command, and its completion will be communicated to the -* application with exactly one of the following events: -* - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed. -* - @ref NRF_EVT_FLASH_OPERATION_ERROR - The command could not be started. -* -* If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the -* erase has been completed -* -* @note -* - This call takes control over the radio and the CPU during flash erase and write to make sure that -* they will not interfere with the flash access. This means that all interrupts will be blocked -* for a predictable time (depending on the NVMC specification in the device's Product Specification -* and the command parameters). -* -* -* @param[in] page_number Page number of the page to erase -* -* @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. -* @retval ::NRF_ERROR_INVALID_ADDR Tried to erase to a non existing flash page. -* @retval ::NRF_ERROR_BUSY The previous command has not yet completed. -* @retval ::NRF_ERROR_FORBIDDEN Tried to erase a protected page. -* @retval ::NRF_SUCCESS The command was accepted. -*/ -SVCALL(SD_FLASH_PAGE_ERASE, uint32_t, sd_flash_page_erase(uint32_t page_number)); - - -/**@brief Flash Protection set - * - * Commands to set the flash protection configuration registers. - This sets the CONFIGx registers of the BPROT peripheral. - * - * @note To read the values read them directly. They are only write-protected. - * - * @param[in] block_cfg0 Value to be written to the configuration register. - * @param[in] block_cfg1 Value to be written to the configuration register. - * @param[in] block_cfg2 Value to be written to the configuration register. - * @param[in] block_cfg3 Value to be written to the configuration register. - * - * @retval ::NRF_ERROR_FORBIDDEN Tried to protect the SoftDevice. - * @retval ::NRF_SUCCESS Values successfully written to configuration registers. - */ -SVCALL(SD_FLASH_PROTECT, uint32_t, sd_flash_protect(uint32_t block_cfg0, uint32_t block_cfg1, uint32_t block_cfg2, uint32_t block_cfg3)); - -/**@brief Opens a session for radio timeslot requests. - * - * @note Only one session can be open at a time. - * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) will be called when the radio timeslot - * starts. From this point the NRF_RADIO and NRF_TIMER0 peripherals can be freely accessed - * by the application. - * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0) is called whenever the NRF_TIMER0 - * interrupt occurs. - * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO) is called whenever the NRF_RADIO - * interrupt occurs. - * @note p_radio_signal_callback() will be called at ARM interrupt priority level 0. This - * implies that none of the sd_* API calls can be used from p_radio_signal_callback(). - * - * @param[in] p_radio_signal_callback The signal callback. - * - * @retval ::NRF_ERROR_INVALID_ADDR p_radio_signal_callback is an invalid function pointer. - * @retval ::NRF_ERROR_BUSY If session cannot be opened. - * @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error. - * @retval ::NRF_SUCCESS Otherwise. - */ - SVCALL(SD_RADIO_SESSION_OPEN, uint32_t, sd_radio_session_open(nrf_radio_signal_callback_t p_radio_signal_callback)); - -/**@brief Closes a session for radio timeslot requests. - * - * @note Any current radio timeslot will be finished before the session is closed. - * @note If a radio timeslot is scheduled when the session is closed, it will be canceled. - * @note The application cannot consider the session closed until the @ref NRF_EVT_RADIO_SESSION_CLOSED - * event is received. - * - * @retval ::NRF_ERROR_FORBIDDEN If session not opened. - * @retval ::NRF_ERROR_BUSY If session is currently being closed. - * @retval ::NRF_SUCCESS Otherwise. - */ - SVCALL(SD_RADIO_SESSION_CLOSE, uint32_t, sd_radio_session_close(void)); - -/**@brief Requests a radio timeslot. - * - * @note The request type is determined by p_request->request_type, and can be one of @ref NRF_RADIO_REQ_TYPE_EARLIEST - * and @ref NRF_RADIO_REQ_TYPE_NORMAL. The first request in a session must always be of type @ref NRF_RADIO_REQ_TYPE_EARLIEST. - * @note For a normal request (@ref NRF_RADIO_REQ_TYPE_NORMAL), the start time of a radio timeslot is specified by - * p_request->distance_us and is given relative to the start of the previous timeslot. - * @note A too small p_request->distance_us will lead to a @ref NRF_EVT_RADIO_BLOCKED event. - * @note Timeslots scheduled too close will lead to a @ref NRF_EVT_RADIO_BLOCKED event. - * @note See the SoftDevice Specification for more on radio timeslot scheduling, distances and lengths. - * @note If an opportunity for the first radio timeslot is not found before 100 ms after the call to this - * function, it is not scheduled, and instead a @ref NRF_EVT_RADIO_BLOCKED event is sent. - * The application may then try to schedule the first radio timeslot again. - * @note Successful requests will result in nrf_radio_signal_callback_t(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START). - * Unsuccessful requests will result in a @ref NRF_EVT_RADIO_BLOCKED event, see @ref NRF_SOC_EVTS. - * @note The jitter in the start time of the radio timeslots is +/- @ref NRF_RADIO_START_JITTER_US us. - * @note The nrf_radio_signal_callback_t(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) call has a latency relative to the - * specified radio timeslot start, but this does not affect the actual start time of the timeslot. - * @note NRF_TIMER0 is reset at the start of the radio timeslot, and is clocked at 1MHz from the high frequency - * (16 MHz) clock source. If p_request->hfclk_force_xtal is true, the high frequency clock is - * guaranteed to be clocked from the external crystal. - * @note The SoftDevice will neither access the NRF_RADIO peripheral nor the NRF_TIMER0 peripheral - * during the radio timeslot. - * - * @param[in] p_request Pointer to the request parameters. - * - * @retval ::NRF_ERROR_FORBIDDEN If session not opened or the session is not IDLE. - * @retval ::NRF_ERROR_INVALID_ADDR If the p_request pointer is invalid. - * @retval ::NRF_ERROR_INVALID_PARAM If the parameters of p_request are not valid. - * @retval ::NRF_SUCCESS Otherwise. - */ - SVCALL(SD_RADIO_REQUEST, uint32_t, sd_radio_request(nrf_radio_request_t const * p_request)); - -/**@} */ - -#ifdef __cplusplus -} -#endif -#endif // NRF_SOC_H__ - -/**@} */ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_svc.h b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_svc.h deleted file mode 100644 index 292c692982..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_API/include/nrf_svc.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form, except as embedded into a Nordic - * Semiconductor ASA integrated circuit in a product or a software update for - * such product, must reproduce the above 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 Nordic Semiconductor ASA nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * 4. This software, with or without modification, must only be used with a - * Nordic Semiconductor ASA integrated circuit. - * - * 5. Any software provided in binary form under this license must not be reverse - * engineered, decompiled, modified and/or disassembled. - * - * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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. - */ - -#ifndef NRF_SVC__ -#define NRF_SVC__ - -#include "stdint.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef SVCALL_AS_NORMAL_FUNCTION -#define SVCALL(number, return_type, signature) return_type signature -#else - -#ifndef SVCALL -#if defined (__CC_ARM) -#define SVCALL(number, return_type, signature) return_type __svc(number) signature -#elif defined (__GNUC__) -#ifdef __cplusplus -#define GCC_CAST_CPP (uint16_t) -#else -#define GCC_CAST_CPP -#endif -#define SVCALL(number, return_type, signature) \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wreturn-type\"") \ - __attribute__((naked)) \ - __attribute__((unused)) \ - static return_type signature \ - { \ - __asm( \ - "svc %0\n" \ - "bx r14" : : "I" (GCC_CAST_CPP number) : "r0" \ - ); \ - } \ - _Pragma("GCC diagnostic pop") - -#elif defined (__ICCARM__) -#define PRAGMA(x) _Pragma(#x) -#define SVCALL(number, return_type, signature) \ -PRAGMA(swi_number = (number)) \ - __swi return_type signature; -#else -#define SVCALL(number, return_type, signature) return_type signature -#endif -#endif // SVCALL - -#endif // SVCALL_AS_NORMAL_FUNCTION - -#ifdef __cplusplus -} -#endif -#endif // NRF_SVC__ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_license-agreement.txt b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_license-agreement.txt deleted file mode 100644 index 00c2e54c47..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_license-agreement.txt +++ /dev/null @@ -1,35 +0,0 @@ -Copyright (c) 2007 - 2017, Nordic Semiconductor ASA -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form, except as embedded into a Nordic - Semiconductor ASA integrated circuit in a product or a software update for - such product, must reproduce the above 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 Nordic Semiconductor ASA nor the names of its - contributors may be used to endorse or promote products derived from this - software without specific prior written permission. - -4. This software, with or without modification, must only be used with a - Nordic Semiconductor ASA integrated circuit. - -5. Any software provided in binary form under this license must not be reverse - engineered, decompiled, modified and/or disassembled. - -THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS -OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA 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. diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_migration-document.pdf b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_migration-document.pdf deleted file mode 100644 index afd9ec7f41..0000000000 Binary files a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_migration-document.pdf and /dev/null differ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_release-notes.pdf b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_release-notes.pdf deleted file mode 100644 index 0cff6f8c31..0000000000 Binary files a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_release-notes.pdf and /dev/null differ diff --git a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_softdevice.hex b/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_softdevice.hex deleted file mode 100644 index 65bb381042..0000000000 --- a/ports/nrf/bluetooth/s132_nrf52_5.0.0/s132_nrf52_5.0.0_softdevice.hex +++ /dev/null @@ -1,8678 +0,0 @@ -:020000040000FA -:1000000000040020E90800007D050000C908000088 -:1000100087050000910500009B050000000000001E -:100020000000000000000000000000000D090000BA -:10003000A505000000000000AF050000B9050000A4 -:10004000C3050000CD050000D7050000E105000054 -:10005000EB050000F5050000FF05000009060000A3 -:10006000130600001D0600002706000031060000F0 -:100070003B060000450600004F0600005906000040 -:10008000630600006D060000770600008106000090 -:100090008B060000950600009F060000A9060000E0 -:1000A000B3060000BD060000C7060000D106000030 -:1000B000DB060000E5060000EF060000F906000080 -:1000C000030700000D0700001707000021070000CC -:1000D0002B070000350700003F070000490700001C -:1000E000530700005D07000067070000710700006C -:1000F0007B070000850700008F07000099070000BC -:10010000A30700001FB500F003F88DE80F001FBD26 -:1001100000F0E0BB1FB56FF00100009040100390AD -:10012000029001904FF010208069000B420900F00E -:100130001F045DF822300120A04083434DF8223097 -:10014000684600F045F91FBDF0B54FF6FF734FF458 -:10015000B4751A466E1E11E0A94201D3344600E080 -:100160000C46091B30F8027B641E3B441A44F9D14B -:100170009CB204EB134394B204EB12420029EBD17E -:1001800098B200EB134002EB124140EA0140F0BD8F -:10019000DE4992B00446D1E90001CDE91001FF2209 -:1001A0004021684600F03CFB94E80F008DE80F000A -:1001B000684610A902E004C841F8042D8842FAD12B -:1001C00010216846FFF7C0FF1090AA208DF8440068 -:1001D000FFF7A0FF00F0F3F84FF01024A069102201 -:1001E0006946803000F002F9A069082210A900F0E9 -:1001F000FDF800F0D8F84FF080510A6949690068AD -:100200004A43824201D8102070470020704710B541 -:10021000D0E900214FF0805002EB8103026944696C -:100220006243934209D84FF01022536903EB8103D4 -:100230000169406941438B4201D9092010BD5069D1 -:10024000401C01D0002010BD0F2010BD70B501680A -:100250000446AF4D4FF01020072952D2DFE801F0DD -:10026000330419293C1E2500D4E902656468294637 -:10027000304600F0CDF82A462146304600F0B6F868 -:10028000AA002146304600F09FFA002800D0032043 -:1002900070BD00F051FB4FF4805007E0201DFFF7C8 -:1002A000AAFF0028F4D100F047FB60682860002016 -:1002B00070BD241D94E80700920000F085FA002824 -:1002C000F6D00E2070BD8069401C12D0201DFFF7B3 -:1002D0009EFF0028F6D109E08069401C09D0201D4E -:1002E000FFF789FF0028EDD1606820B12046FFF7B5 -:1002F0004FFF042070BDFFF70DFF00F060F800F025 -:1003000052F8072070BD10B50C46182802D0012005 -:10031000086010BD2068FFF799FF206010BD4FF006 -:100320001024A069401C05D0A569A66980353079E4 -:10033000AA2808D06069401C2DD060690068401C64 -:1003400029D060692CE010212846FFF7FDFE3168B6 -:1003500081421CD1A16901F18002C03105E030B1B8 -:1003600008CA51F8040D984201D1012000E0002094 -:100370008A42F4D158B1286810B1042803D0FEE7AE -:10038000284600F057F862496868086008E000F005 -:1003900016F800F008F84FF480500168491C01D0AD -:1003A00000F0A4FAFEE7BFF34F8F5A4801685A4A9B -:1003B00001F4E06111430160BFF34F8FFEE74FF09E -:1003C00010208169491C02D0806900F0AEB87047E6 -:1003D000524A01681160121D416811604F4A8168DC -:1003E00010321160111DC068086070472DE9F0419E -:1003F00017460D460646002406E03046296800F000 -:10040000A7F8641C2D1D361DBC42F6D3BDE8F08153 -:1004100070B50C4605464FF4806608E0284600F0AB -:1004200084F8B44205D3A4F5806405F58055002C0A -:10043000F4D170BD4168044609B1012500E00025F2 -:100440004FF010267069A268920000F0BDF9C8B1A3 -:10045000204600F01AF89DB17669A56864684FF4EB -:10046000002084420AD2854208D229463046FFF74E -:10047000CFFF2A4621463046FFF7B8FFFFF79FFF20 -:10048000FFF791FFFFF746FEF8E72DE9FF414FF038 -:100490001024616980680D0B01EB800000F6FF708D -:1004A000010B0020009001900290024603906846E4 -:1004B00001230BE0560902F01F0C50F8267003FAD6 -:1004C0000CFC47EA0C0740F82670521CAA42F1D3F4 -:1004D0000AE04A0901F01F0650F8225003FA06F616 -:1004E000354340F82250491C8029F2D3A169090BF9 -:1004F0004A0901F01F0150F822408B409C4340F80C -:100500002240FFF765FFBDE8FF8100005C090000A5 -:10051000000000200CED00E00400FA050006004099 -:10052000144801680029FCD07047134A0221116069 -:1005300010490B68002BFCD00F4B1B1D186008687E -:100540000028FCD00020106008680028FCD070470C -:10055000094B10B501221A60064A1468002CFCD021 -:10056000016010680028FCD0002018601068002886 -:10057000FCD010BD00E4014004E5014008208F4993 -:1005800009680958084710208C4909680958084724 -:1005900014208A49096809580847182087490968BA -:1005A0000958084730208549096809580847382004 -:1005B00082490968095808473C2080490968095858 -:1005C000084740207D4909680958084744207B496D -:1005D00009680958084748207849096809580847B0 -:1005E0004C20764909680958084750207349096822 -:1005F0000958084754207149096809580847582084 -:100600006E490968095808475C206C49096809580F -:100610000847602069490968095808476420674904 -:100620000968095808476820644909680958084753 -:100630006C20624909680958084770205F490968B9 -:100640000958084774205D49096809580847782007 -:100650005A490968095808477C20584909680958C7 -:10066000084780205549096809580847842053499C -:1006700009680958084788205049096809580847F7 -:100680008C204E4909680958084790204B49096851 -:10069000095808479420494909680958084798208B -:1006A00046490968095808479C204449096809587F -:1006B0000847A0204149096809580847A4203F4934 -:1006C000096809580847A8203C490968095808479B -:1006D000AC203A49096809580847B02037490968E9 -:1006E00009580847B4203549096809580847B8200F -:1006F0003249096809580847BC2030490968095837 -:100700000847C0202D49096809580847C4202B49CB -:10071000096809580847C82028490968095808473E -:10072000CC202649096809580847D0202349096880 -:1007300009580847D4202149096809580847D82092 -:100740001E49096809580847DC201C4909680958EE -:100750000847E0201949096809580847E420174963 -:10076000096809580847E8201449096809580847E2 -:10077000EC201249096809580847F0200F49096818 -:1007800009580847F4200D49096809580847F82016 -:100790000A49096809580847FC20084909680958A6 -:1007A00008475FF480700549096809580847000048 -:1007B00003480449024A034B704700000000002030 -:1007C000680900006809000040EA010310B59B07B2 -:1007D0000FD1042A0DD310C808C9121F9C42F8D0AB -:1007E00020BA19BA884201D9012010BD4FF0FF305C -:1007F00010BD1AB1D30703D0521C07E0002010BD72 -:1008000010F8013B11F8014B1B1B07D110F8013BFD -:1008100011F8014B1B1B01D1921EF1D1184610BDDE -:1008200002F0FF0343EA032242EA024200F005B865 -:100830007047704770474FF000020429C0F01280E3 -:1008400010F0030C00F01B80CCF1040CBCF1020F83 -:1008500018BF00F8012BA8BF20F8022BA1EB0C0158 -:1008600000F00DB85FEAC17C24BF00F8012B00F84E -:10087000012B48BF00F8012B70474FF0000200B574 -:10088000134694469646203922BFA0E80C50A0E8B3 -:100890000C50B1F12001BFF4F7AF090728BFA0E861 -:1008A0000C5048BF0CC05DF804EB890028BF40F82D -:1008B000042B08BF704748BF20F8022B11F0804F6F -:1008C00018BF00F8012B7047014B1B68DB68184705 -:1008D0000000002009480A497047FFF7FBFFFFF7B7 -:1008E00011FC00BD20BFFDE7064B1847064A10600B -:1008F000016881F30888406800470000680900002B -:10090000680900001F030000000000201EF0040F13 -:100910000CBFEFF30881EFF3098188690238007892 -:10092000182803D100E00000074A1047074A126860 -:100930002C3212681047000000B5054B1B68054AB1 -:100940009B58984700BD00000703000000000020EE -:100950005809000004000000001000000000000022 -:0809600000FFFFFF0090D0032F -:10100000E8120020111D0200152F0000831C0200B1 -:10101000152F0000152F0000152F00000000000004 -:10102000000000000000000000000000691D020038 -:10103000152F000000000000152F0000152F0000E4 -:10104000D11D0200D71D0200152F0000152F000032 -:10105000152F0000152F0000152F0000152F000080 -:10106000DD1D0200152F0000152F0000E31D0200FA -:10107000152F0000E91D0200EF1D0200F51D020002 -:10108000152F0000152F0000152F0000152F000050 -:10109000152F0000152F0000152F0000152F000040 -:1010A000152F0000FB1D0200152F0000152F00005A -:1010B000152F0000152F0000152F0000152F000020 -:1010C000011E0200152F0000152F0000152F000033 -:1010D000152F0000152F0000152F0000152F000000 -:1010E000152F0000152F0000152F0000152F0000F0 -:1010F000152F0000152F0000152F0000152F0000E0 -:10110000152F0000152F000000F002F820F0EDFD73 -:101110000AA090E8000C82448344AAF10107DA4552 -:1011200001D120F0E2FDAFF2090EBAE80F0013F092 -:10113000010F18BFFB1A43F0010318471C130200EC -:101140003C1302000A444FF0000C10F8013B13F06E -:10115000070408BF10F8014B1D1108BF10F8015B10 -:10116000641E05D010F8016B641E01F8016BF9D103 -:1011700013F0080F1EBF10F8014BAD1C0C1B09D15A -:101180006D1E58BF01F801CBFAD505E014F8016BCC -:1011900001F8016B6D1EF9D59142D6D3704700005E -:1011A0000023002400250026103A28BF78C1FBD870 -:1011B000520728BF30C148BF0B6070471FB500F011 -:1011C0003DF88DE80F001FBD1EF0040F0CBFEFF3BC -:1011D0000880EFF30980014A104700006F2E0000DD -:1011E0008269034981614FF001001044704700009B -:1011F000F511000001B41EB400B512F0AFFD01B44A -:101200000198864601BC01B01EBD0000F0B4404606 -:10121000494652465B460FB402A0013001B506486C -:10122000004700BF01BC86460FBC804689469246F7 -:101230009B46F0BC704700000911000020F052BD31 -:1012400070B51A4C054609202070A01C00F05FF80C -:101250005920A08029462046BDE8704007F0F1BF24 -:1012600007F0FABF70B50C461149097829B1A0F111 -:101270006001552908D3012013E0602804D06928B3 -:1012800002D043F201000CE020CC0A4E94E80E009C -:1012900006EB8000A0F58050241FD0F8806E284611 -:1012A000B047206070BD012070470000080000209A -:1012B0001C0000204C1E020010B504460021012035 -:1012C00000F03BF800210B2000F037F80421192032 -:1012D00000F033F804210D2000F02FF804210E2037 -:1012E00000F02BF804210F2000F027F80421C84358 -:1012F00000F023F80621162000F01FF80621152023 -:1013000000F01BF82046FFF79BFF002010BD9D2139 -:1013100001807047FFF7A4BF10487047104A10B50E -:1013200014680F4B0F4A08331A60FFF79BFF0C48F5 -:10133000001D046010BD704770474907090E002862 -:1013400006DA00F00F0000F1E02080F8141D70476D -:1013500000F1E02080F800147047000003F900421B -:101360001005024001000001FE48002101604160BB -:10137000018170472DE9F743044692B091464068D9 -:1013800012F0B2FF40B1606812F0B7FF20B9607888 -:1013900000F00300022801D0012000E00020F14EFF -:1013A0004D463072484612F05BFF18B1102015B060 -:1013B000BDE8F0832946012001F029FF0028F6D17D -:1013C00001258DF842504FF4C050ADF84000002286 -:1013D00010A9284606F0FAFB0028E8D18DF8425003 -:1013E0004FF428504FF00008ADF8400047461C214C -:1013F0006846CDF81C8020F018FC9DF81C0008AA57 -:1014000020F00F00401C20F0F00010308DF81C0080 -:1014100020788DF81D0061789DF81E0061F3420070 -:1014200040F001008DF81E009DF800000AA940F070 -:1014300002008DF800002089ADF83000ADF8327060 -:10144000608907AFADF834000B97606810AC0E9060 -:101450000A94684606F0AFF90028A8D1BDF820002C -:1014600030808DF8425042F60120ADF840009DF8E2 -:101470001E0008AA20F00600801C20F001008DF854 -:101480001E000220ADF83000ADF8340013A80E9015 -:101490000AA9684606F08FF9002888D1BDF8200017 -:1014A0007080311D484600F033F9002887D18DF84F -:1014B000425042F6A620ADF840001C216846CDF807 -:1014C0001C8020F0B2FB9DF81C00ADF8345020F0D9 -:1014D0000F00401C20F0F00010308DF81C009DF82B -:1014E0001D0008AA20F0FF008DF81D009DF81E00C9 -:1014F0000AA920F0060040F00100801C8DF81E00B3 -:101500009DF800008DF8445040F002008DF8000076 -:10151000CDE90A4711A80E90ADF83050684606F0A4 -:101520004AF9002899D1BDF82000F08000203EE75C -:101530003EB504460820ADF80000204612F090FEAB -:1015400008B110203EBD2146012001F060FE0028B8 -:10155000F8D12088ADF804006088ADF80600A088B6 -:10156000ADF80800E088ADF80A007E4801AB6A4695 -:101570008088002106F024FDBDF800100829E1D084 -:1015800003203EBD1FB50446002002900820ADF8A0 -:101590000800CDF80CD0204612F062FE10B11020E9 -:1015A00004B010BD6F4802AA81884FF6FF7006F0A4 -:1015B0004EFF0028F4D1BDF80810082901D00320FF -:1015C000EEE7BDF800102180BDF802106180BDF883 -:1015D0000410A180BDF80610E180E1E701B582B0FA -:1015E0000220ADF800005F4802AB6A464088002147 -:1015F00006F0E6FCBDF80010022900D003200EBD65 -:101600001CB5002100910221ADF80010019012F0EC -:101610004DFE08B110201CBD52486A4641884FF665 -:10162000FF7006F014FFBDF800100229F3D003206C -:101630001CBDFEB54B4C06461546207A0F46C0072A -:1016400005D0084612F00CFE18B11020FEBD0F2088 -:10165000FEBDF82D01D90C20FEBD304612F000FE73 -:1016600018BB208801A905F0ECFD0028F4D13078E2 -:101670008DF80500208801A906F081FC0028EBD137 -:1016800000909DF800009DF8051040F002008DF8D4 -:101690000000090703D040F008008DF80000208802 -:1016A000694606F009FC0028D6D1ADF8085020881C -:1016B0003B4602AA002106F083FCBDF80810A942AF -:1016C000CAD00320FEBD7CB50546002000900190E5 -:1016D0000888ADF800000C462846019512F004FE7B -:1016E00018B9204612F0E2FD08B110207CBD15B1FA -:1016F000BDF8000050B11B486A4601884FF6FF70E4 -:1017000006F0A5FEBDF8001021807CBD0C207CBD3C -:1017100030B593B0044600200D460090142101A876 -:1017200020F083FA1C2108A820F07FFA9DF8000021 -:10173000CDF808D020F00F00401C20F0F000103051 -:101740008DF800009DF8010020F0FF008DF80100E9 -:101750009DF8200040F002008DF8200001208DF857 -:10176000460001E0E201002042F60420ADF844000A -:1017700011A801902088ADF83C006088ADF83E00CB -:10178000A088ADF84000E088ADF842009DF8020066 -:1017900006AA20F00600801C20F001008DF802004F -:1017A0000820ADF80C00ADF810000FA8059001A9B5 -:1017B00008A806F000F8002803D1BDF8180028801A -:1017C000002013B030BD0000F0B5007B059F1E4621 -:1017D00014460D46012800D0FFDF0C2030803A204F -:1017E0003880002C08D0287A052806D0287B0128CC -:1017F00000D0FFDF17206081F0BDA889FBE72DE94D -:10180000F04786B0144691F80C900E9A0D46B9F147 -:10181000010F0BD01021007B2E8A8846052807D0A7 -:10182000062833D0FFDF06B0BDE8F0870221F2E7DB -:10183000E8890C2100EB400001EB400018803320C8 -:101840001080002CEFD0E889608100271AE0009614 -:10185000688808F1020301AA696900F07AFF06EBC3 -:101860000800801C07EB470186B204EB4102BDF87B -:10187000040090810DF1060140460E3210F04CFD3F -:101880007F1CBFB26089B842E1D8CCE73420108019 -:10189000E889B9F1010F11D0122148430E301880A8 -:1018A000002CC0D0E88960814846B9F1010F00D012 -:1018B0000220207300270DF1040A1FE00621ECE747 -:1018C0000096688808F1020301AA696900F041FFE7 -:1018D00006EB0800801C86B2B9F1010F12D007EBAD -:1018E000C70004EB4000BDF80410C18110220AF1CA -:1018F0000201103020F000F97F1CBFB26089B842AD -:10190000DED890E707EB470104EB4102BDF8040085 -:10191000D0810AF102014046103210F0FDFCEBE7E5 -:101920002DE9F0470E4688B090F80CC096F80C8070 -:10193000378AF5890C20109902F10C044FF0000A47 -:10194000BCF1030F08D0BCF1040F3ED0BCF1070F6F -:101950007DD0FFDF08B067E705EB850C00EB4C009E -:10196000188031200880002AF4D0A8F1060000F089 -:10197000FF09558125E0182101A820F056F90097AC -:101980007088434601AA716900F0E3FEBDF80400C7 -:101990002080BDF80600E080BDF808002081A21C70 -:1019A0000DF10A01484610F0B7FCB9F1000F00D064 -:1019B00018B184F804A0A4F802A007EB080087B2CD -:1019C0000A346D1EADB2D6D2C4E705EB850C00EB30 -:1019D0004C00188032200880002ABBD0A8F10500F6 -:1019E00000F0FF09558137E000977088434601AA4F -:1019F000716900F0AEFE9DF80600BDF80410E180AC -:101A00002179420860F3000162F34101820862F328 -:101A10008201C20862F3C301020962F304114209A0 -:101A200062F34511820962F386112171C009607168 -:101A3000BDF80700208122460DF10901484610F04B -:101A40006BFC18B184F802A0A4F800A000E007E045 -:101A500007EB080087B20A346D1EADB2C4D279E735 -:101A6000A8F1020084B205FB08F000F10E0CA3F807 -:101A700000C035230B80002AA6D0558194810097A1 -:101A800083B270880E32716900F063FE62E72DE95F -:101A9000F84F1E460A9D0C4681462AB1607A00F531 -:101AA0008070D080E089108199F80C000C274FF0ED -:101AB00000084FF00E0A0D2873D2DFE800F09E07F1 -:101AC0000E1C28303846556A737373002146484609 -:101AD0000095FFF779FEBDE8F88F207B9146082836 -:101AE00002D0032800D0FFDF378030200AE000BF9B -:101AF000A9F80A80EFE7207B9146042800D0FFDF99 -:101B0000378031202880B9F1000FF1D1E3E7207B45 -:101B10009146042800D0FFDF37803220F2E7207B97 -:101B20009146022800D0FFDF37803320EAE7207B90 -:101B30001746022800D0FFDF3420A6F800A0288036 -:101B4000002FC8D0A7F80A80C5E7207B17460428D5 -:101B500000D0FFDF3520A6F800A02880002FBAD0E3 -:101B60004046A7F80A8012E0207B1746052802D0DD -:101B7000062800D0FFDF1020308036202880002F7C -:101B8000A9D0E0897881A7F80E80B9F80E00B88155 -:101B9000A1E7207B9146072800D0FFDF3780372060 -:101BA000B0E72AE04FF0120018804FF0380017001D -:101BB000288090D0E0897881A7F80E80A7F810805F -:101BC00099F80C000A2805D00B2809D00C280DD054 -:101BD000FFDF80E7207B0C2800D0FFDF01200AE038 -:101BE000207B0D2800D0FFDF042004E0207B0E289E -:101BF00000D0FFDF052038736DE7FFDF6BE770B5BE -:101C00000C46054601F076FA20B10078222804D26D -:101C1000082070BD43F2020070BD052128460EF079 -:101C20001DFF206008B1002070BD032070BD2DE9AC -:101C3000FF4784B00027824602970798904689465E -:101C400012300AF0E2F8401D20F00306079828B988 -:101C500007A95046FFF7D3FF002853D1B9F1000F71 -:101C600005D00798017B19BB052504681BE098F88F -:101C70000000092803D00F2812D0FFDF45E00799A4 -:101C800003254868B0B3497B42887143914238D9F3 -:101C90008AB2B3B2011D0EF03AFD0446078002E09D -:101CA000079C042508340CB1208810B1032D28D0DE -:101CB0002BE00798012112300AF0DFF8ADF80C0094 -:101CC000024602AB2946504608F0B1F9070001D19F -:101CD000A01C029007983A461230C8F80400A8F8F1 -:101CE00002A003A94046029B0AF0D4F8C0B107281D -:101CF00014D200E005E0DFE800F0060811110F0A39 -:101D00000C00132026E6002024E6112022E60820FD -:101D100020E643F203001DE607201BE6032019E638 -:101D2000BDF80C002346CDE900702A4650460799BD -:101D300000F035FD57B9032D08D10798B3B2417BA8 -:101D4000406871438AB2011D0EF0F5FCB9F1000F35 -:101D5000D9D0079981F80C90D5E72DE9FE4F91462F -:101D60001A881C468A468046FAB102AB494608F0FA -:101D70005EF9050019D04046A61C27880EF08AFFA0 -:101D80003246072629463B4600960EF049FB20883E -:101D90002346CDE900504A465146404600F0FFFC3C -:101DA000002020800120BDE8FE8F0020FBE710B559 -:101DB00086B01C46AAB104238DF800301388ADF814 -:101DC00008305288ADF80A208A788DF80E200988EC -:101DD000ADF80C1000236A462146FFF728FF06B035 -:101DE00010BD1020FBE770B50D4605210EF036FE44 -:101DF000040000D1FFDF294604F11200BDE8704065 -:101E00000AF024B82DE9F8430D468046002607F075 -:101E1000CCFA0446287812287BD2DFE800F07A5406 -:101E2000543C355632321332323209323232323287 -:101E30002879001FC0B2022801D0102810D114BB8D -:101E4000FFDF35E004B9FFDF052140460EF006FE56 -:101E5000007B032806D004280BD0072828D0FFDFFA -:101E6000072657E02879801FC0B2022820D050B141 -:101E7000F6E72879401FC0B2022819D0102817D0E1 -:101E8000EEE704B9FFDF13E004B9FFDF287901288A -:101E90000ED1172139E0052140460EF0DFFD070085 -:101EA00000D1FFDF07F11201404609F0A6FF2CB177 -:101EB0002A462146404600F05CFC2BE013214046B8 -:101EC00002F0AAFC26E0FFDF24E004B9FFDF0521D1 -:101ED00040460EF0C3FD060000D1FFDF694606F163 -:101EE000120009F094FF060000D0FFDFA98817292F -:101EF00001D2172200E00A46BDF80000824202D952 -:101F0000014602E005E01729C3D3404600F057FC24 -:101F1000CEE7FFDF3046BDE8F883401D20F0030226 -:101F200019B102FB01F0001D00E0002010447047D1 -:101F300013B5009850B100244FEA0D000EF091FB4C -:101F4000002C02D1F84A009911601CBD0124002028 -:101F5000F4E72DE9F0470C461546242120461FF0F2 -:101F600064FE05B9FFDFA87860732888DFF8B8A39E -:101F7000401D20F00301AF788946DAF800000EF02A -:101F80008EFB060000D1FFDF4FF000082660A6F8A8 -:101F9000008077B109FB07F1091D0AD0DAF80000CB -:101FA0000EF07DFB060000D1FFDF6660C6F8008002 -:101FB00001E0C4F80480298804F11200BDE8F0476C -:101FC00009F00DBF2DE9F047804601F112000D46E2 -:101FD000814609F01AFF401DD34F20F003026E7BAB -:101FE0001446296838680EF085FB3EB104FB06F202 -:101FF000121D03D0696838680EF07CFB05200EF0D6 -:10200000D7FC044605200EF0DBFC201A012802D183 -:1020100038680EF039FB49464046BDE8F04709F004 -:10202000F3BE70B5054605210EF018FD040000D181 -:10203000FFDF04F112012846BDE8704009F0DDBE63 -:102040002DE9F04F91B04FF0000BADF834B0ADF882 -:1020500004B047880C4605469246052138460EF0E6 -:10206000FDFC060000D1FFDF24B1A780A4F806B074 -:10207000A4F808B0297809220B20B2EB111F297AA5 -:102080007DD104F110023827C91E4FF00C094FF022 -:10209000010803920F2973D2DFE801F0F4F3F28113 -:1020A00008D48A8FA13DDDF5F0B8B800307B022856 -:1020B00000D0FFDFA88909EBC001ADF80410302182 -:1020C000ADF83410002C25D06081B5F80E900027B3 -:1020D0001DE004EBC708317C88F80E10F189A8F8E0 -:1020E0000C10CDF800906888042304AA296900F038 -:1020F00030FBBDF81010A8F8101009F10400BDF86D -:1021000012107F1C1FFA80F9A8F81210BFB2608964 -:10211000B842DED80FE1307B022800D0FFDFE9892A -:1021200009EBC100ADF804003020ADF83400287B85 -:102130000A90001FC0B20F90002CEBD06181B5F85F -:102140001090002727E000BFCDF8009068886969EB -:1021500003AA0A9B00F0FDFA0A9904EBC70809EBF1 -:1021600001001FFA80F908F10C0204A90F9810F081 -:10217000D3F818B188F80EB0A8F80CB001E0D7E099 -:10218000D4E0BDF80C10A8F81010BDF80E107F1C9C -:10219000A8F81210BFB26089B842D5D8CBE00DA81C -:1021A000009001AB224629463046FFF728FBC2E0EB -:1021B000307B082805D0FFDF03E0307B082800D003 -:1021C000FFDFE8891030ADF804003620ADF83400A8 -:1021D000002C3FD0A9896181F189A18127E0307B62 -:1021E000092800D0FFDFA88900F10C01ADF8041028 -:1021F0003721ADF83410002C2CD06081E889009094 -:10220000AB89688804F10C02296956E0E889392114 -:10221000103080B2ADF80400ADF83410002C74D04A -:10222000A9896181287A10280AD002212173E989BD -:10223000E181288A0090EB8968886969039A3CE00B -:102240000121F3E70DA8009001AB22462946304654 -:10225000FFF766FB6FE0307B0A2800D0FFDF12201B -:10226000ADF80400ADF834704CB3A9896181A4F8CD -:1022700010B0A4F80EB084F80C805CE020E002E01E -:1022800031E039E042E0307B0B2800D0FFDF288AC4 -:10229000ADF834701230ADF8040084B1042121731C -:1022A000A9896181E989E181298A2182688A00906E -:1022B0002B8A688804F11202696900F04AFA3AE050 -:1022C000307B0C2800D0FFDF1220ADF80400ADF801 -:1022D00034703CB305212173A4F80AB0A4F80EB001 -:1022E000A4F810B027E00DA8009001AB22462946C3 -:1022F0003046FFF769FA1EE00DA8009001AB2246B8 -:1023000029463046FFF7C3FB15E036E03B21ADF828 -:102310000400ADF8341084B3A4F80680A4F808B023 -:1023200084F80AB007E0000010000020FFDF02E0A0 -:10233000012919D0FFDFBDF80400AAF800007CB124 -:10234000BDF834002080BDF804006080BDF8340082 -:10235000392805D03B2803D03C2801D086F80CB0A2 -:1023600011B00020BDE8F08F3C21ADF80400ADF8BD -:10237000341014B1697AA172DDE7FFE7AAF8000012 -:10238000EEE72DE9F84356880F46804615460521AD -:1023900030460EF063FB040000D1FFDF12340094DE -:1023A0003B46414630466A6809F02EFFB3E570B5FA -:1023B0000D4605210EF052FB040000D1FFDF294637 -:1023C00004F11200BDE8704009F02CBD70B50D4657 -:1023D00005210EF043FB040000D1FFDF294604F184 -:1023E0001200BDE8704009F050BD70B505460521EA -:1023F0000EF034FB040000D1FFDF04F10803214696 -:102400002846BDE870400422A7E470B505460521C2 -:102410000EF024FB040000D1FFDF2146284623688C -:10242000BDE87040052298E470B5064605210EF01F -:1024300015FB040000D1FFDF04F1120009F0E5FCF8 -:10244000401D20F0030511E0011D00880322431800 -:1024500021463046FFF781FC00280BD0607BABB2F1 -:10246000684382B26068011D0EF09BF96068418884 -:102470000029E9D170BD70B50E46054606F095FFFE -:10248000040000D1FFDF0120207266726580207891 -:1024900020F00F00C01C20F0F00030302070BDE8AC -:1024A000704006F085BF2DE9F0438BB00D46144611 -:1024B000814606A9FFF7A3FB002814D14FF6FF764B -:1024C00001274FF420588CB103208DF80000102014 -:1024D000ADF8100007A8059007AA204604A90FF040 -:1024E0003AFF78B107200BB0BDE8F0830820ADF8C3 -:1024F00008508DF80E708DF80000ADF80A60ADF848 -:102500000C800CE00698A17801742188C1818DF8B7 -:102510000E70ADF80850ADF80C80ADF80A606A4650 -:1025200002214846069BFFF782FBDCE708B5012243 -:102530008DF8022042F60202ADF800200A4603237D -:102540006946FFF734FC08BD08B501228DF802206A -:1025500042F60302ADF800200A4604236946FFF75D -:1025600026FC08BD00B587B079B102228DF80020A5 -:102570000A88ADF808204988ADF80A1000236A4699 -:102580000521FFF754FB07B000BD1020FBE709B1A0 -:1025900007230CE40720704770B588B00D46144639 -:1025A000064606A9FFF72BFB00280ED17CB10620BA -:1025B000ADF808508DF80000ADF80A40069B6A4659 -:1025C0000821DC813046FFF732FB08B070BD0520E2 -:1025D0008DF80000ADF80850F0E700B587B059B1AC -:1025E00007238DF80030ADF80820039100236A46D8 -:1025F0000921FFF71CFBC6E71020C4E770B588B0BF -:102600000C460646002506A9FFF7F9FA0028DCD19A -:1026100006980121123009F030FC9CB1217806297E -:1026200021D2DFE801F0200505160318801E80B2D4 -:10263000C01EE28880B20AB1A3681BB1824203D9EE -:102640000C20C2E71020C0E7042904D0A08850B9AC -:1026500001E00620B9E7012913D0022905D0042999 -:102660001CD005292AD00720AFE709208DF80000EB -:102670006088ADF80800E088ADF80A00A068039013 -:1026800023E00C208DF800006088ADF80800E08899 -:10269000ADF80A00A0680A25039016E00D208DF819 -:1026A00000006088ADF80800A088ADF80A00E08856 -:1026B000ADF80C00A0680B25049006E00E208DF804 -:1026C000000060788DF808000C256A4629463046DF -:1026D000069BFFF7ACFA78E700B587B00F228DF8BC -:1026E0000020ADF8081000236A461946FFF79FFA4C -:1026F00049E700B587B071B102228DF800200A8841 -:10270000ADF808204988ADF80A1000236A46062172 -:10271000FFF78DFA37E7102035E770B586B006462B -:1027200001200D46ADF808108DF800000146002389 -:102730006A463046FFF77BFA040008D12946304646 -:1027400005F058FC0021304605F072FC204606B02A -:1027500070BDF8B51C4615460E46069F0EF088FA69 -:102760002346FF1DBCB231462A4600940DF01FFEE1 -:10277000F8BD10B548800878144620F00F00C01C42 -:1027800020F0F00090300B4608701822214603F12B -:1027900008001FF0F6F9BDE8104006F009BE30B49D -:1027A0001146DDE902423CB1032903D0002330BCCD -:1027B00008F0D3BA0123FAE71A8030BC704770B52D -:1027C0000C460546FFF70FFB2146284605F021FC85 -:1027D0002846BDE87040012105F02ABC4FF0E022F8 -:1027E0004FF400410020C2F88011204908702049B0 -:1027F00090020860704730B51C4D04462878A0420E -:1028000018BF002C02D0002818BFFFDF2878A04294 -:1028100008BF30BD2C701749154A0020ECB1164D89 -:10282000DFF858C0131F012C0DD0022C1CBFFFDF96 -:1028300030BD086003200860CCF800504FF4000061 -:102840001060186030BD086002200860CCF80050AD -:102850004FF040701060186030BD086008604FF0A5 -:102860006070106030BD00B5FFDF00BD18000020B3 -:1028700008F5014000F500402403002014F5004055 -:1028800070B50B2000F0B5F9082000F0B2F9002176 -:102890000B2000F0C4F90021082000F0C0F9EC4C36 -:1028A00001256560A5600020C4F84001C4F844011A -:1028B000C4F848010B2000F0A7F9082000F0A4F9A3 -:1028C0000B2000F08BF9256070BD10B50B2000F0D7 -:1028D00090F9082000F08DF9DD4801214160816008 -:1028E000DC490A68002AFCD10021C0F84011C0F878 -:1028F0004411C0F848110B2000F086F9BDE81040E3 -:10290000082000F081B910B50B2000F07DF9BDE87A -:102910001040082000F078B900B530B1012806D089 -:10292000022806D0FFDF002000BDCB4800BDCB4809 -:1029300000BDCA48001D00BD70B5C9494FF0004038 -:102940000860C84DC00BC5F80803C74800240460E0 -:10295000C5F840410820C43500F04BF9C5F83C41AA -:10296000C248047070BD08B5B94A002128B10128D9 -:1029700011D002281CD0FFDF08BD4FF48030C2F810 -:102980000803C2F84803B3483C300160C2F8401164 -:10299000BDE80840D0E74FF40030C2F80803C2F8A1 -:1029A0004803AC4840300160C2F84411AB480CE029 -:1029B0004FF48020C2F80803C2F84803A548443009 -:1029C0000160C2F84811A548001D0068009008BDCC -:1029D00070B516460D460446022800D9FFDF0022D6 -:1029E0009B48012304F110018B4000EB8401C1F8E6 -:1029F000405526B1C1F84021C0F8043303E0C0F8C7 -:102A00000833C1F84021C0F8443370BD2DE9F041CE -:102A10001C46154630B1012834D0022839D0FFDFDA -:102A2000BDE8F081891E002221F07F411046FFF7AA -:102A3000CFFF012C24D000208C4E8A4F01247070CF -:102A40003C61894900203C3908600220091D08606A -:102A5000854904203039086083483D350560C7F852 -:102A60000042082000F0D0F82004C7F80403082032 -:102A700000F0B4F87A49E007091F08603470CFE726 -:102A80000120D9E7012B02D00022012005E001221C -:102A9000FBE7012B04D000220220BDE8F04197E7BC -:102AA0000122F9E76B480068704770B500F0C7F87D -:102AB000674C0546D4F840010026012809D1D4F816 -:102AC0000803C00305D54FF48030C4F80803C4F8E8 -:102AD0004061D4F8440101280CD1D4F808038003E4 -:102AE00008D54FF40030C4F80803C4F8446101204D -:102AF00010F0F6FBD4F8480101280CD1D4F80803F3 -:102B0000400308D54FF48020C4F80803C4F8486196 -:102B1000022010F0E5FB5648056070BD70B500F06E -:102B20008EF8524D0446287858B1FFF705FF6878B3 -:102B300020B1002085F8010010F0D2FB4C48046061 -:102B400070BD0320F8E74FF0E0214FF40010C1F80A -:102B500000027047152000F057B842490120086173 -:102B6000082000F051B83F494FF47C10C1F8080329 -:102B70000020024601EB8003C3F84025C3F8402142 -:102B8000401CC0B20628F5D37047410A43F60952EB -:102B90005143C0F3080010FB02F000F5807001EB18 -:102BA0005020704710B5430B48F2376463431B0C49 -:102BB0005C020C602F4C03FB04002F4B4CF2F724FB -:102BC00043435B0D13FB04F404EB402000F58070DD -:102BD0004012107008681844086010BD00F01F0211 -:102BE000012191404009800000F1E020C0F800116F -:102BF000704700F01F02012191404009800000F160 -:102C0000E020C0F88011704700F01F0201219140C0 -:102C10004009800000F1E020C0F8801270474907A9 -:102C2000090E002806DA00F00F0000F1E02080F81D -:102C3000141D704700F1E02080F8001470470C4824 -:102C4000001F00680A4A0D49121D116070470000FC -:102C500000B0004004B500404081004044B1004055 -:102C600008F501400080004040850040340000200D -:102C700014050240F7C2FFFF6F0C010001000001C4 -:102C80000A4810B50468094909480831086010F07D -:102C9000BBFB0648001D046010BD0649002008600B -:102CA0004FF0E0210220C1F8800270471005024079 -:102CB00001000001FC1F004010B50D2000F06FF86E -:102CC000C4B26FF0040000F06AF8C0B2844200D0D1 -:102CD000FFDF3A490120086010BD70B50D2000F0FB -:102CE00048F8374C0020C4F800010125C4F804530B -:102CF0000D2000F049F825604FF0E0216014C1F884 -:102D0000000170BD10B50D2000F033F82C480121F2 -:102D100041600021C0F80011BDE810400D2000F016 -:102D200033B8284810B50468264927480831086098 -:102D30002349D1F80001012804D0FFDF2148001DFC -:102D4000046010BD1D48001D00680022C0B2C1F81B -:102D5000002110F074FFF1E710B51948D0F8001108 -:102D60000029FBD0FFF7DDFFBDE810400D2000F08B -:102D70000BB800F01F02012191404009800000F1D2 -:102D8000E020C0F88011704700F01F02012191403F -:102D90004009800000F1E020C0F880127047002850 -:102DA00006DA00F00F0000F1E02090F8140D03E0C7 -:102DB00000F1E02090F800044009704704D500407D -:102DC00000D00040100502400100000110B5202095 -:102DD00000F075F8202000F07DF84449202081F8AB -:102DE0000004434900060860091D42480860FEF7D8 -:102DF00093FA3F49C83108603F48D0F8041341F0C6 -:102E00000101C0F80413D0F8041341F08071C0F838 -:102E10000413364901201C39C1F8000110BD10B55A -:102E2000202000F04CF8324800210160001D0160B4 -:102E30002F4A481EE83A10602F4AC2F808032C4B6C -:102E4000C8331960C2F80001C2F860012B4908605C -:102E5000BDE81040202000F03DB825492848EC3955 -:102E60000860704722492648E8390860704770B505 -:102E70001F4A8069E83A224911601F49D1F8006170 -:102E80000023204D1D4A5C1E1EB1A84206D300211E -:102E90000FE0D1F8606186B1A84209D2C1F80031D3 -:102EA000C1F860311460BDE87040202000F012B815 -:102EB0001168BDE870401EF0E3BEFFDF70BD00F09A -:102EC0001F02012191404009800000F1E020C0F87C -:102ED0008011704700F01F020121914040098000DD -:102EE00000F1E020C0F880127047000020E000E010 -:102EF000000602406413002000000240000402406B -:102F000001000001003002000F4A12680D498A4298 -:102F10000CD118470C4A12680A4B9A4206D101B5E7 -:102F200010F00EFFFFF799FFBDE80140074909685F -:102F30000958084706480749054A064B70470000EC -:102F400000000000BEBAFECAB0000020040000204D -:102F5000E8120020E812002070B50C46054609F082 -:102F6000F0FA21462846BDE870400AF0E2BB10B5F1 -:102F700011F054FBFFF732FC11F0F0F9BDE81040FE -:102F800011F0A2BA01208107086070470120810773 -:102F90004860704712480068C00700D001207047A1 -:102FA0000F48001F0068C00700D0012070470C4880 -:102FB00008300068C00700D0012070470848103072 -:102FC0000068704706490C310A68D20306D50968C3 -:102FD00001F00301814201D10120704700207047B8 -:102FE0000C0400407047704770477047704702F00C -:102FF000FF0343EA032242EA02421EF0F6BD704795 -:103000002CFFFFFFDBE5B151003002009D00FFFF08 -:1030100084000000404B4C0066D342DA82CFB49D5E -:10302000E40AD77E68976592800939FF30B5FF4D75 -:10303000044610280AD0112C06D02846122CC1783C -:1030400006D0132C08D0FFDFEC7030BDFFDFFBE7AC -:103050001129F9D0FFDFF7E71129F5D0FFDFF3E7FA -:1030600070B50FF0E3FA044610F0A0FC201AC4B2C9 -:1030700006200DF09DFC054606200DF0A1FC2E1A41 -:1030800007200DF095FC054607200DF099FCE74957 -:10309000281A3218C87812280DD000231A44132891 -:1030A0000BD0002002440878022808D000201044E9 -:1030B000201AC0B270BD0123F0E70120F2E7012021 -:1030C000F5E7DA4800B58079D849420897B051F859 -:1030D000070F89880CD017228DF80020CDF8020048 -:1030E000ADF806100BA968460AF0B4FF17B000BD92 -:1030F0004422F1E702210DF0B1BC2DE9F04196B078 -:103100001D4690460E460746FFF7F4FF04000BD01D -:103110002078222804D3A07FC0F34010A84206D113 -:10312000082016B0BDE8F08143F20200F9E749201B -:103130008DF80000ADF802703DB101208DF804005B -:103140008DF805608DF8068002E000208DF80400FF -:103150000BA968460AF07EFFA07F65F34510A077B3 -:103160000020DEE730B50446A1F120000D460A2814 -:103170004AD2DFE800F005070C1C2328353A3F440B -:10318000FFDF42E0207820283FD1FFDF3DE0A74865 -:103190000178032939D0C078132836D02078242824 -:1031A00033D0252831D023282FD0FFDF2DE0207801 -:1031B00022282AD0232828D8FFDF26E020782228BA -:1031C00023D0FFDF21E0207822281ED024281CD025 -:1031D00026281AD0272818D0292816D0FFDF14E077 -:1031E0002078252811D0FFDF0FE0207825280CD08B -:1031F000FFDF0AE02078252807D0FFDF05E02078F0 -:10320000282802D0FFDF00E0FFDF257030BD30B599 -:103210000B8840F67B444FF6FF72022801D09342A0 -:1032200004D09D1FA54224D2022802D04D88954289 -:1032300003D04D88AD1FA5421BD24C88A34218D89D -:103240008B88B3F5FA7F14D2022802D0C888904246 -:1032500005D0C88840F677450A38A84209D2C88800 -:10326000904208D0944206D05B1C6343B3EB800FBE -:1032700001DB072030BD002030BD70B514460D467F -:10328000064610F0EDFF60B90DB1A54201D90C2042 -:1032900070BD002409E000BF56F8240010F0E0FFE4 -:1032A00008B1102070BD641CE4B2AC42F4D300201D -:1032B00070BDF0B50024059D10B1A94203D850E0BF -:1032C00009B90020F0BD0920F0BD055DD5B1071991 -:1032D00097F801C0BCF1150F2DD03BDCBCF1150FE8 -:1032E00038D2DFE80CF037122020262628282F2F8E -:1032F000373737373737373737372000025D22BB4C -:10330000641CE4B28C42F9D3DBE7022DDBD1BD783B -:103310001D70072D01D26D0701D40A20F0BD15786C -:1033200045F0010515E0EF43FF0707E0012D07D049 -:1033300010E00620F0BD2F07A7F18057002FF5D031 -:103340003046F0BD1578AF0701D50B20F0BD45F034 -:1033500002051570055D641C2C44E4B28C4202D950 -:10336000B1E74FF448568C42AFD3AAE710B50278C4 -:10337000540809D0012243F20223012C07D0022C69 -:103380000DD0032C13D10FE00020087005E08079E8 -:103390000324B4EB901F0AD10A70002010BD80797D -:1033A000B2EB901F03D1F7E780798009F4D018467B -:1033B00010BD1E4A117C39B1517C022908D0032965 -:1033C00008D043F2022070470146901D01F0FCBC7A -:1033D000032100E0012101700020704738B50C4640 -:1033E0000546694601F0F0FC00280DD19DF800105B -:1033F000207861F34700207055F8010FC4F80100F0 -:10340000A888A4F80500002038BD38B51378E8B1C5 -:1034100002281BD006A46D46246800944C7905EB65 -:103420009414247864F34703137003E0CC01002064 -:103430000302FF0103280ED003F0FE00107008689D -:10344000C2F801008888A2F8050038BD23F0FE0309 -:1034500013700228E9D1D8B240F00100EEE730B590 -:103460000C46097897B0222902D2082017B030BD47 -:1034700028218DF80010ADF80200132A03D03B2A52 -:1034800001D00720F2E78DF804200BA968460AF066 -:10349000E1FD050003D121212046FFF763FE284608 -:1034A000E4E700B597B023218DF80010ADF80200D5 -:1034B0001088ADF804005088ADF80600D088ADF84B -:1034C0000A009088ADF808000020ADF80C00ADF8B7 -:1034D0000E000BA968460AF0BDFD07E600B597B0DF -:1034E0002C22FA4968461EF04CFB0020CDF8030060 -:1034F000ADF80700F648007C022801D0012000E06A -:1035000000208DF809000BA968460AF0A3FD0028E9 -:1035100000D0FFDFEAE52DE9FF470220EC4E8DF8F1 -:1035200004000027B08AADF80600B84643F202094D -:103530004DE001A80DF0FBF9050006D0B08AA8B354 -:10354000A6F81480ADF806803FE0039CA07F010739 -:103550002DD504F124000090A28EBDF8080021466C -:1035600004F1360301F00DFE050005D04D452BD0CA -:10357000112D3DD0FFDF3BE0A07F20F00800A077B9 -:10358000E07F810861F30000C10861F34100E0774A -:1035900094F8210000F01F0084F8200020782828EB -:1035A00027D129212046FFF7DDFD22E015E0400765 -:1035B0000BD5BDF80800214604F10E02FFF771FF9C -:1035C00005000DD04D4510D100257F1CFFB2022013 -:1035D0000DF0EEF9401CB842ABD8052D12D008E032 -:1035E000A07F20F00400A07703E0112D00D0FFDFC2 -:1035F0000025BDF80600B082052D05D0284604B090 -:10360000BDE8F087A6F814800020F8E770B50646FC -:10361000FFF770FD054605F0C8FE040000D1FFDF8E -:103620006680207820F00F00801C20F0F000203011 -:1036300020700620207295F83E006072BDE8704050 -:1036400005F0B6BE2DE9F04786B0040000D1FFDFDB -:1036500020789F4E20F00F00801C20F0F00070308A -:10366000207060680178091F182931D2DFE801F065 -:10367000FD30303053FC300CFCFC40FD3030FD762A -:10368000FDFD3030FDFDFBFA86883046FFF732FD48 -:103690000546304607F05FFAE0B16068807985F84A -:1036A0003E0021212846FFF75DFD3046FEF7B9FCBC -:1036B000304603F0C3FF3146022010F085FDA87F9D -:1036C00020F01000A877FFF726FF002800D0FFDFCA -:1036D00006B095E7207820F0F0002030207006201A -:1036E0002072668060688079607205F061FED8E7BC -:1036F00085882846FFF7FEFC00B9FFDF6068807808 -:10370000012800D0FFDF6068817906B02846BDE857 -:10371000F04707F0FDBD86883046FFF7EBFC05005B -:1037200000D1FFDF05F044FE60683146C088288183 -:1037300060680089688160684089A881022010F073 -:1037400043FD0020A875A87F00F003000228BFD128 -:10375000FFF7E1FE0028BBD0FFDFB9E780783C2807 -:1037600003D0002502280AD000E00125002720B15F -:103770003C2802D0022800D0FFDF17B1B8E00127B3 -:10378000F5E705F015FE1DB1B07801F0DCFAA1E017 -:103790006568B5F804A0A879AD1C012806D0307979 -:1037A000814605F097FB070003D101E0B078F7E709 -:1037B000FFDF0022022150460DF047F9040000D13E -:1037C000FFDF22212046FFF7CDFC2879012800D019 -:1037D0000220A17F804668F30101A177288B208118 -:1037E000688B6081A88BA08184F822908DF8088076 -:1037F000B8680090F86801906A46032150460DF0C1 -:1038000024F900B9FFDFB888ADF81000B8788DF85A -:10381000120004AA052150460DF017F900B9FFDF88 -:10382000B888ADF80C00F8788DF80E0003AA0421D2 -:1038300050460DF00AF900B9FFDF062105F112002C -:1038400001F0EDFA28B36879800700D5FFDF6979C8 -:10385000E07D61F34700E075D5F80600A061688956 -:10386000A08303E05EE057E050E062E0062105F14E -:103870000C0001F0D4FAB0B1B0794108607861F37E -:1038800047006070D6F80700C4F80200B6F80B00D5 -:1038900012E0E07D20F0FE00801CE075D5F81200FB -:1038A000A061E88ADCE7607820F0FE00801C607090 -:1038B000E868C4F80200288AE080B8F1010F09D056 -:1038C000B8F1020F14D0FFDF02E70000CC1F0200A6 -:1038D000CC0100203078032800D0FFDF002108460B -:1038E00010F072FC06B00120BDE8F04701F0FAB913 -:1038F000F078132800D0FFDF0021062010F064FCD0 -:1039000006B01120BDE8F047FFF790BB06B0204697 -:10391000BDE8F04701F0E6BE05F04AFDB07C40F09E -:10392000020004E005F044FDB07C40F00400B074F7 -:10393000CEE606B0BDE8F04705F03ABD2DE9F04708 -:1039400005460078914600270209FF480C463E468E -:10395000012A6DD000234FF6FF71022A69D0072A91 -:1039600009D00A2A71D0FFDFA9F800600CB12780C6 -:103970006680002044E6D5F804C09CF80060142E50 -:103980007DD010DC04F1080204F118080F2E21D0BC -:1039900004DC042E5AD0082E57D10DE0122E6FD021 -:1039A000132EF9D11FE0153E072E4ED2DFE806F0A8 -:1039B000C14D4D099FEAB00012271026BCF8040043 -:1039C00014E11C27092694B3BCF80200A0806868A3 -:1039D00000795AE11B2709264CB30320207268683E -:1039E0004088A080C0E79CF802003C2827D0102720 -:1039F00018260CF1020CD4B1BCF80200A080BCF86F -:103A000018006082BCF818002082BCF81A00A0825E -:103A1000BCF81C00E0829CF805000CF10601FFF7E1 -:103A2000F4FC9CF8040028B10120E0739CE703E05B -:103A3000BFE0DFE00220F8E7A9F8006099E71B2764 -:103A40000926002CF8D023728EE720E11D273726A7 -:103A5000002CF1D0A18069680879491DFFF7D5FCD9 -:103A6000686890F82B00A0756868C0780428E07D2D -:103A700016D020F00100E0756968C97801E06DE0BA -:103A800011E061F34200E07569681F22C97A61F3B1 -:103A9000C700E075696840460C311EF02DF863E7F9 -:103AA00040F00100E7E71D273726002CC4D0A18095 -:103AB0006868411D0079FFF7A8FC696804F10F02EE -:103AC00001F10C00CB7A01461846FFF79EFC6868AE -:103AD000807CA0756868C178E07D61F3420020F0C9 -:103AE000F900E0751F2140461EF09FF83CE72027B3 -:103AF0001026002CA0D0A180686804F10902407A49 -:103B000020726968CB1C88781946FFF77EFC2BE78A -:103B100021270A26002C8FD0BCF80210A1806968EA -:103B200009792172696849796172817C21F0040107 -:103B300057E022270B26002C84D0BCF80400A0807C -:103B40006868807820726868807901F077F960721F -:103B50006868C07901F072F9A07205E72427102681 -:103B6000002CA3D0BCF80200A080686800792081F6 -:103B70006868007A60816868C088A0816868408948 -:103B8000E081F1E623271026002C8FD0BCF802102C -:103B9000A1806968898821816968C98861816968AB -:103BA0000989A18169684989E181817C21F002014B -:103BB00017E0297A012903D0022914D0FFDFD3E6C8 -:103BC0001F271026002C95D06988A180A989218102 -:103BD000E9896181298AA181698AE181817C21F059 -:103BE00001018174C0E6122768881026214601F081 -:103BF00003F9B9E6287A072850D2DFE800F0373D0C -:103C00003D484848040011270926002C94D0B5F8F7 -:103C100002804046FFF76EFA90F822A0A4F80480D4 -:103C2000687A2072042140460CF02AFF05214046A4 -:103C30000CF026FF002140460CF022FF01214046F7 -:103C40000CF01EFF032140460CF01AFF02214046F3 -:103C50000CF016FF062140460CF012FF07214046EB -:103C60000CF00EFF504601F06EF87DE61B2709268A -:103C7000002C8AD0A180E6E61B270926002C84D0E0 -:103C8000A180287A012800D0022020726CE64A46E2 -:103C900021462846BDE8F04701F0AFBEFFDF63E6EE -:103CA00030B5294D97B0E878132802D0082017B016 -:103CB00030BD22208DF800000BA968460AF0CAF931 -:103CC000040002D1287901F03EF80021062010F00E -:103CD0007BFA2046EBE700B51B4897B0C078122866 -:103CE00001D0082016E41E208DF8000000208DF879 -:103CF00002008DF803000BA968460AF0ABF9002812 -:103D0000F0D10021062010F05FFA1120FFF78EF9A4 -:103D10000020E7E710B50C4C96B02078012815D0AC -:103D20001B208DF8000000208DF802000BA96846CA -:103D30000AF090F900280AD10021084610F044FA50 -:103D40002078032805D007E0CC010020082016B019 -:103D500010BDA07800F0F7FF012000F0C3FF0020A5 -:103D6000F5E770B5002538B1022817D0062836D0FF -:103D7000072800D0FFDF70BDFFF7CCFF0028FAD185 -:103D800005F013FB0028F6D0017821F00F01891C03 -:103D900021F0F0012031017005723FE08EB2304613 -:103DA000FFF7A8F9040000D1FFDF20782128E2D036 -:103DB00005F0FBFA60B1017821F00F01891C21F0B8 -:103DC000F00110310170022101724680A57525E0D5 -:103DD00021463046BDE870401322FFF740BBFE4845 -:103DE000C478122C03D0132C04D0FFDF70BDFFF772 -:103DF00072FF01E0FFF754FF0028F7D105F0D5FA74 -:103E00000028F3D0017821F00F01891C21F0F00186 -:103E100020310170122C05D002210172BDE87040E2 -:103E200005F0C6BA0121F8E72DE9F04116460C006D -:103E3000804600D1FFDF307820F00F00801C20F09A -:103E4000F000103030702078012804D0022817D0FC -:103E5000FFDFBDE8F0814046FFF74CF9050000D1D7 -:103E6000FFDF0320A87505F0A3FA94E80F000836D9 -:103E700086E80F00D848817C41F001018174E8E7B1 -:103E80004046FFF737F9050000D1FFDFA1884FF664 -:103E9000FF700027814202D1E288824203D0814232 -:103EA00001D1E08840B105F083FA94E80F000836AC -:103EB00086E80F00AF75CCE7A87D0128C9D178232B -:103EC00000224146022010F0D5F80220A875C0E774 -:103ED00030B5054697B00C46084610F0C1F978BBDE -:103EE00000210120203D072D73D2DFE805F00425D5 -:103EF0004C515A6640000021072010F03BF908B1F0 -:103F00001120D4E624208DF80000D4F80200CDF86A -:103F10000200A0798DF806000BA968460AF09AF80D -:103F2000050057D1002208231146072010F0A2F8FF -:103F300007284FD0FFDF4DE0606810F0D5F908B1D9 -:103F40001020B4E64A208DF800002088ADF8020069 -:103F50006088ADF804000BA968460AF07BF80500FC -:103F600038D1606898B3BDF83010018032E04C2041 -:103F70008DF800002088ADF80200A07800F0010064 -:103F80008DF8040014E0206801F0D5FF054621E01B -:103F90004B2207E08DF802000AE000BF8DF8021006 -:103FA00006E046228DF800202278D207F6D0F1E70D -:103FB0000BA968460AF04EF8E8E738208DF80000B3 -:103FC0002088ADF802006088ADF80400F0E701E059 -:103FD000FFE7072528466AE630B5054697B00C4648 -:103FE000084610F063F908B1102060E6203D072D67 -:103FF00027D2DFE805F00424242426262400208884 -:10400000FFF778F820B10078222804D208204EE685 -:1040100043F202004BE625208DF800002088ADF821 -:1040200002000BA968460AF015F80028DDD1DDF87A -:104030003210C4F802109DF83610A17137E6062040 -:1040400035E6072033E66448801D704738B51621F1 -:1040500061481DF0C8FD012000F044FE1120FEF76C -:10406000E5FF5D4C6846E11D05F0FFF89DF8001086 -:10407000A07961F3470020F00100A07100202074B6 -:104080004FF46170E08102206074FFF71AF800B10C -:10409000FFDFFDF769F901F0E2FA38BD10B50C4613 -:1040A000402120461DF09FFDA07F20F00300A07757 -:1040B000202020700020A07584F8230010BD7047D8 -:1040C0007CB5054610F0CCF808B110207CBD424C00 -:1040D000A11DD4F806000090D4F80A0001902846EB -:1040E000FFF77CF90028F1D1FEF7EBFF0028EDD0B7 -:1040F0000099C4F80610BDF8041061819DF80610FF -:1041000021737CBD10B5044610F0D0F808B1102022 -:1041100010BD314922468879C91D4008FFF775F95D -:10412000002010BD2DE9F0479CB00D4604004FF073 -:10413000000812D00822FFF7A0F800281CD10026A2 -:1041400009E000BF54F8260004A9FFF70FF9002882 -:1041500012D1761CF6B2AE42F4D32F460A2006AD39 -:104160000DF1440A8DF8180026465146284609F0FC -:1041700071FF20B143F203201CB0BDE8F087404638 -:10418000DFF8548088F805002EB300244FF00B09A7 -:104190001DE000BF56F8240005A9FFF7E7F800B1BD -:1041A000FFDF9DF81400A87056F8240050F8011F96 -:1041B000C5F803108088A5F8070085F800905146DF -:1041C000284609F047FF00B1FFDF641CE4B2BC429F -:1041D000E0D388F8057001E0CC0100200020CBE797 -:1041E0002DE9F0479EB01546894604001DD00F46C4 -:1041F00008222946FFF741F8002810D1002612E0D6 -:1042000054F8260005A9103000F0DEFD002806D184 -:104210003FB157F8260010F023F810B110201EB05F -:10422000ABE7761CF6B2AE42EAD30026A5F1010850 -:104230001CE000BF06F1010A0AF0FF0712E000BF10 -:1042400054F82600017C4A0854F827100B7CB2EB86 -:10425000530F05D10622113011311DF021FC78B128 -:104260007F1CFFB2AF42EBD30AF0FF064645E1DB0D -:10427000C8462E4607AD0DF1480924B1012003E0E0 -:1042800043F20520CBE700208DF81E0031208DF889 -:104290001C004946284609F0DDFE38B934208DF867 -:1042A0001C004946284609F0D5FE10B143F204200F -:1042B000B5E77CB300272BE054F82700A91C103089 -:1042C00000F082FD00B1FFDF54F82700102250F803 -:1042D000111FC5F803108088A5F8070054F82710AF -:1042E00005F109001DF008FCB8F1000F16D058F8D0 -:1042F0002710102205F119001DF0FEFB3220287056 -:104300004946284609F0A6FE00B1FFDF7F1CFFB238 -:10431000B742D1D3FFF7E2F8002080E705F119009A -:1043200001F0FDFDEAE770B596B004460FF098FF86 -:1043300018B960680FF0E1FF10B1102016B070BD21 -:1043400060884AF2B811884207D82078FE4D6E4640 -:1043500028B1012806D0022804D00720EEE7FEF796 -:10436000B0FE1AE06078022804D0032802D043F29D -:104370000220E3E7687417208DF80000697C0020B4 -:10438000CDF80200ADF80600022934D003292FD061 -:10439000FFDF0BA9684609F05DFE0028CED16068FA -:1043A00001F0B0FD207870B101208DF80200F01C02 -:1043B00001F0B5FD4E208DF800000BA9684609F00C -:1043C00049FE00B1FFDF20782874FFF787F8608886 -:1043D00098B1E88180B2ADF8020030208DF800007D -:1043E0000BA9684609F036FE00B1FFDF0020A5E703 -:1043F0008DF80700CDE74020FAE74FF46170E8E759 -:1044000010B504460FF052FF20B9606838B10FF0C4 -:104410006BFF08B1102010BD606801F080FDCA4834 -:10442000C1896180417C6170007C2070002010BDDA -:104430002DE9F0419CB0054600208DF864008DF810 -:1044400060008DF830008DF868001E4614468846DE -:1044500028460FF052FF18B920460FF04EFF10B15A -:1044600010201CB0F5E455EA040018D01F270CAB4F -:1044700019AA414628460097FEF71BFF0028F0D1F5 -:104480001AAB18AA314620460097FEF712FF002803 -:10449000E7D19DF86000C00703D00A20E1E70720BC -:1044A000DFE701AF7DB11A208DF804008DF806809A -:1044B00042462946F81C1DF01FFB0DA901A809F072 -:1044C000C9FD0028CDD17CB120208DF804008DF8E5 -:1044D000066032462146F81C1DF00EFB0DA901A80E -:1044E00009F0B8FD0028BCD197499DF8300048700C -:1044F0000020B6E72DE9F0479CB08A464FF000084F -:1045000092A104468DF83480D1E90001CDE919016A -:1045100020460FF0A5FE90B92078012803D16068ED -:104520000FF09EFE58B9884D4FF00109287C40B12C -:10453000687C022805D160680FF0DFFE08B110200A -:104540001AE62878012801D0082015E607200CF08B -:1045500037FA18B9207878B101280DD0FEF780FD20 -:1045600060B1608943F6E172A0F1200191422178A7 -:104570000CD3012904D0B6E01220FDE51320FBE5A1 -:1045800000287DD1A18900297AD109E0012907D02D -:104590006978C90704D0A189002971D0B4296FD8DE -:1045A000217831B1012908D0022904D0032967D12B -:1045B0000AE0002609E0022607E008B9A08908B150 -:1045C000042609E0012607E00326287C50B1687C18 -:1045D000022807D1606828B10DA96068FEF7C6FE01 -:1045E0000028ADD1207A30B1012806D0022806D0AB -:1045F000032878D105E0002704E0012702E0022724 -:1046000000E003270EB1022E0ED16FB16879B8B366 -:104610006878800702D043F20120ADE5022E03D175 -:10462000022F60D0032F5ED0207808B1012806D178 -:10463000504600F06BFB002887D185F802A01820B7 -:104640008DF838006089ADF83A006089ADF83C001B -:104650008DF83E600DF13F00FEF7ABFE00B1FFDFCD -:104660009DF834008DF840002078012806D0287C81 -:1046700068B1687C02280AD1606840B1606800E0D7 -:1046800031E050F8011FCDF84110808802E040462B -:10469000CDF84180ADF845008DF84870A07BC0F39F -:1046A0004002014662F35F01C0F3800041EA8000EE -:1046B00019A9085C8DF84700A8B169460EA809F051 -:1046C000C9FC0028A9D11B208DF838008DF83A903C -:1046D00069460EA809F0BEFC00289ED19DF8010095 -:1046E0001B281CD101E0072046E5052E0CD2DFE88F -:1046F00006F0030308080300A87800F017FB032066 -:1047000000E0022000F0EEFA012E0AD0A08940B1AC -:1047100000228300114610460FF0ACFC08B10320C4 -:104720002AE5002028E52DE9FC4107460D46032631 -:1047300008460FF0E2FD00286CD13846FEF7DAFC9F -:1047400004000CD0207805E0CC0100200706050409 -:1047500003020100222805D20820BDE8FC8143F2B3 -:104760000200FAE7A07F00F0030C2DB12946604655 -:10477000FEF74DFD0600F0D1BCF1010F05D0BCF1F4 -:10478000020F18D0FFDF3046E7E7A07D2946022858 -:1047900001D011B107E01120DFE76846FCF7F2FE17 -:1047A0000028DAD16946384606F075FD0600EAD1E0 -:1047B0000120A075E7E7A07D032803D1FE48807C97 -:1047C000C00701D035B30EE025B1A07F40071FD44C -:1047D000002100E00121384606F07DFD0600D2D11F -:1047E000A075002DCFD02A4621463846FEF759FE47 -:1047F00006461128C7D1A07F4107C4D4296844F8D0 -:104800000E1F6968616040F0040020740026BAE75A -:104810001126B8E71020A0E770B50C460546FEF754 -:1048200069FC010005D022462846BDE87040FEF72D -:1048300016BE43F2020070BD00B597B043218DF85B -:1048400000108DF802000BA9684609F003FC17B0B0 -:1048500000BD0123FEF751BC00231A461946FEF79E -:104860004CBC30B597B004460FF0FAFC10B11020E4 -:1048700017B030BD204600F095FA0028F8D1CE4D93 -:10488000E878112801D00820F2E7FEF7E9FBE0B351 -:104890002078800701D56879C0B31D208DF800000D -:1048A0002078022200F001008DF802006088ADF847 -:1048B0000400A088ADF806002078C0F3400102EAA9 -:1048C000500001438DF8091002A8FEF772FD00B1F7 -:1048D000FFDF0BA9684609F0BDFB0028C8D11E20E8 -:1048E0008DF8000001208DF8020000208DF80300F3 -:1048F0000BA9684609F0AEFB0028B9D1E08800F0AA -:104900006DFA0400B4D1122001E004E005E0FEF7E6 -:104910008DFB2046ACE71320AAE70720A8E72DE986 -:10492000F043A54E074697B0F078994615460C46D9 -:10493000122803D1FFF7CFF9002816D120460FF037 -:104940008FFCE8BB28460FF08BFCC8BB204600F06C -:1049500029FA002809D129460220FEF758FC002830 -:1049600003D1F078112803D0082017B0BDE8F083F8 -:1049700006200CF025F850B12078800701D5707919 -:1049800038B1FEF76DFB022805D21320EDE71220A7 -:10499000EBE70720E9E721208DF800006088ADF8FB -:1049A0000200A088ADF8040020784FF00008C0F3A2 -:1049B00040008DF80600207880071FD4384600E0BC -:1049C00002E00FF04DFC08B11020CEE73878400827 -:1049D00008D0012809D0022807D0032805D043F2C7 -:1049E0000220C2E78DF8078002E001208DF8070061 -:1049F00057F8010F0290B888ADF80C000DF10E00C9 -:104A0000FEF7D7FC08B10320AFE72888ADF8100007 -:104A10006888ADF81200A888ADF81400E888ADF8F1 -:104A20001600ADF81880ADF81A80484600F06EF90F -:104A300000289AD186F804900BA9684609F00AFB71 -:104A4000002892D1307900F071F9E08800F0C6F9C1 -:104A500004008AD11320FEF7E9FA204685E730B535 -:104A6000054697B00C4608460FF020FC08B1102010 -:104A7000FEE62846FEF73EFB38B10178222902D334 -:104A8000807F800604D40820F2E643F20200EFE6BD -:104A900013208DF80000ADF802500BA9684609F00C -:104AA000D9FA0028E4D19DF932107F2901D0217074 -:104AB000DEE60520DCE630B5054697B00C46084634 -:104AC0000FF0CEFB08B11020D2E62846FEF712FB0D -:104AD00020B10078222804D20820C9E643F202005F -:104AE000C6E63548807C400701D51120C0E6207815 -:104AF000800802D16078800801D00720B8E65620EF -:104B00008DF80000ADF8025020788DF80400607830 -:104B10008DF805000BA9684609F09CFAA8E62DE976 -:104B2000F041B0B014460D460646FEF7E3FA070022 -:104B300006D03878222806D2082030B0BDE8F081AF -:104B400043F20200F9E728460FF0D7FB30B94FF0E7 -:104B500000084CB120460FF0C7FB08B11020ECE76D -:104B6000C4F80080A4F804801348807C800701D535 -:104B70001120E2E797F8220004F0ACF98088011DCB -:104B8000FB2901D2001D00E0FB20C0B26A46294685 -:104B900000F0E3F82C22094904A81CF0F2FFBDF84C -:104BA0000200ADF81400BDF80600ADF81600ADF82F -:104BB0001260BDF8000003E0CC010020A01F02003D -:104BC000ADF81800BDF80400ADF81A001AA904A841 -:104BD00009F040FA00B1FFDFBDF86C00ADF8080045 -:104BE000BDF86E00ADF80A00BDF87000BDF8721097 -:104BF000BDF800200844ADF80C0007201B2A9CD308 -:104C0000BDF802101B2998D3FB2A96D8FB2994D80B -:104C100006278A4210D10121104600F05AF8BDF84B -:104C20000410884208D1BDF80200012100F051F8BB -:104C3000BDF80610884201D038467EE7BDF808006E -:104C400028B9BDF80A1011B9BDF80C1029B35DB12F -:104C5000298849B1698839B124B102982060BDF82A -:104C60000C00A080132068E7BDF80010BDF80A20F2 -:104C7000081A80B2ADF80000BDF80210891AADF82C -:104C80000210012100F025F8ADF80400BDF8020083 -:104C9000012100F01EF8ADF806002C226B490FA888 -:104CA0001CF06FFFADF83E60BDF80200ADF84000AB -:104CB000BDF80600ADF84200BDF80000ADF84400B4 -:104CC000BDF80400ADF8460025A90FA809F0C2F907 -:104CD00033E7022903D0C000703080B270478000F3 -:104CE0003C30FAE730B55A4D040008D0012C04D00E -:104CF000022C06D0032C04D0FFDF2C7030BDFFDF68 -:104D0000FBE728780128F8D0FFDFF6E710B5044666 -:104D100004F0E0F830B1407830B1204604F0EEFB0A -:104D2000002010BD072010BD122010BD10B504F0EA -:104D3000D1F8040000D1FFDF607800B9FFDF6078B0 -:104D4000401E607010BD10B504F0C4F8040000D11E -:104D5000FFDF6078401C607010BD10B5144631B1A3 -:104D60000A68226049686160218839B107E02080C3 -:104D700060800121FFF7ADFFA0800DE020806188F9 -:104D800001B96080A08820B920880121FFF7A1FF28 -:104D9000A080E088002804D160880121FFF799FFF6 -:104DA000E08010BD418843F6FD730A1F9A4209D284 -:104DB0008088042806D3B0F5804F03D8884201D8F4 -:104DC00000207047072070470278520804D0012A5B -:104DD00002D043F202207047FEF7C8BA10B548B1BE -:104DE00083000022114606200FF044F9062801D066 -:104DF000032010BD002010BD70B50C0006460DD07C -:104E0000FEF778F9050000D1FFDFA6802889208110 -:104E1000288960816889A081A889E08170BD10B56A -:104E200000231A4603E0845C2343521CD2B28A4218 -:104E3000F9D30BB1002010BD012010BD00B5012831 -:104E400003D0022801D0FFDF002000BDF81F0200C0 -:104E5000CC01002010B504460FF002FA08B1102072 -:104E600010BD2078C0F30210042807D86078072806 -:104E700004D3A178102901D8814201D2072010BDA6 -:104E8000E078410706D421794A0703D4000701D40A -:104E9000080701D5062010BD002010BD10B51378FD -:104EA0005C08C37F64F30003C3771478A40864F339 -:104EB0004103C3771078C309487863F34100487011 -:104EC00013781C090B7864F347130B701378DB0815 -:104ED00063F3000048705078487110BD10B5C47875 -:104EE0000B7864F300030B70C478640864F3410327 -:104EF0000B70C478A40864F382030B70C478E408D0 -:104F000064F3C3030B700379117863F3000111702C -:104F100003795B0863F34101117003799B0863F324 -:104F2000820111700079C00860F3C301117010BDD7 -:104F300070B514460D46064604F037FA80B1017884 -:104F4000182221F00F01891C21F0F001A03100F896 -:104F5000081B21461CF015FEBDE8704004F028BA7D -:104F600029463046BDE870401322FEF778BA10B5E6 -:104F7000FE4C94F8300000280CD104F120014FF6CB -:104F8000FF72A1F110000DF04DF900B1FFDF01201B -:104F900084F8300010BD2DE9F047064608A8894680 -:104FA00090E830041F469046142128461CF03DFE30 -:104FB0000021CAF80010B8F1000F03D0B9F1000FBA -:104FC00003D114E03878C00711D020680FF06EF9D3 -:104FD000F0BBB8F1000F07D12068123028602068BC -:104FE000143068602068A8602168CAF8001038781A -:104FF000800728D560680FF077F948BBB9F1000F3A -:105000002DD0FFF720F80168C6F8C8118188A6F8EE -:10501000CC11807986F8CE01FFF7A9FFDFF84C8329 -:1050200008F12008C5F80C80626862B196F8C801E2 -:1050300006F2C91140081032FEF7E7F91022414686 -:1050400060681CF059FD3878400712D5A06800E070 -:1050500002E00FF02BF950B11020BDE8F087606836 -:105060000028F9D0E8606068C6F8C401EBE7A068E2 -:1050700028610020F1E730B5054608780C4620F09D -:105080000F00401C20F0F0011031217000206070F2 -:1050900095F8230030B104280FD0052811D0062838 -:1050A00014D0FFDF20780121B1EB101F04D295F856 -:1050B000200000F01F00607030BD21F0F0002030B3 -:1050C00002E021F0F00030302070EBE721F0F0003A -:1050D0004030F9E710B510B190F8BD4044B1A34895 -:1050E00090F83540002064B108601060186010BD71 -:1050F00000F1BC040C6000F1E40100F58670116061 -:10510000F4E79A4C34340C60EFE700B58BB007231A -:10511000CDE902128DF801300191944900236431E8 -:105120000591099301468DF8103068460DF052F84C -:10513000002800D0FFDF0BB000BD70B590B0154661 -:105140000C4602220646ADF80820092103AB04F004 -:105150006EFF0490002812D00C208DF8010004206E -:105160008DF8040004F59A74099605948DF818508A -:105170000AA968460DF02EF800B1FFDF012010B03B -:1051800070BD30B597B00C462C251A998DF800509B -:10519000ADF80200B3B11868019058680290ADF8FC -:1051A0000C2010220DF10E001CF0A6FC0BA9684685 -:1051B00008F050FF002803D1A17F41F01001A17732 -:1051C00017B030BD00200190E8E72DE9F047064612 -:1051D000808A8CB080B20D468246FDF78BFF044674 -:1051E000624F3078283FDFF884914FF00008112893 -:1051F00073D2DFE800F072F1350936777E98A7F2B6 -:10520000EFEEEDEC5BECEC00A07F00F0030001287A -:1052100006D0002150460BF021FC050003D101E02F -:105220000121F7E7FFDF99F85C10C90702D0D9F830 -:1052300060000BE0032105F121000EF0E2FCD5F83F -:1052400021004B49B0FBF1F201FB1200C5F821002F -:105250007068A867B068E8672078252800D0FFDF6D -:10526000ECE0A07F00F00300012806D000215046AA -:105270000BF0F4FB060003D101E00121F7E7FFDFAB -:105280003078810702D52178252904D040F001002B -:1052900030700CB0E1E60220287096F820002871EA -:1052A00006F121003136C5E90206F2E7A07F00F0E1 -:1052B0000300012806D0002150460BF0CFFB04006C -:1052C00003D101E00121F7E7FFDF2078C10605D512 -:1052D0001320287041346C60DBE7BEE140F0080029 -:1052E0002070D6E72148082128380EF08AFC0320D8 -:1052F00016E02A208DF8000010220DF102007168DE -:105300001CF0FAFB10220DF11200B1681CF0F4FB46 -:10531000164968462C3908F09DFE00B1FFDF0420D5 -:1053200028706F60B5E7E07FC00600D5FFDF307CF6 -:10533000B28800F001030CB05046BDE8F0470921E7 -:1053400005F00BBD04B9FFDF716821B1102204F133 -:1053500024001CF0D1FB28212046FDF703FFA07F8D -:1053600000F00300022814D104E00000180200201D -:1053700040420F0004F12400002300901A46214609 -:105380005046FFF7FEFE112807D029212046FDF7E1 -:10539000E9FE307A84F820007BE7A07F000700D583 -:1053A000FFDF14F81E0F40F008002070A4F81680EC -:1053B000C4F81880C4F81C806178084661F3820044 -:1053C000410861F3C3006070307AE07061E727E064 -:1053D0003FE17AE051E000E037E0A07F00F0030019 -:1053E000012806D0002150460BF038FB040003D101 -:1053F00001E00121F7E7FFDF022104F189000EF04F -:1054000000FC1020287004F5E4706860B4F889107E -:10541000298204F18000FD496861C5E9029138E7FD -:10542000A07F00F00300012805D0002150460BF0BA -:1054300015FB18B901E00121F8E7FFDF0CB0324697 -:1054400021465046BDE8F04772E504B9FFDF2078F9 -:105450002128A1D93079012803D1E07F40F0100044 -:10546000E077324621465046FFF762FD0CB02046F9 -:10547000BDE8F0472321FDF775BE3279AA8005F11A -:1054800008030921504604F0D2FDE86010B1112054 -:105490002870FEE6A07F00F00300012806D000215E -:1054A00050460BF0DBFA040003D101E00121F7E7DD -:1054B000FFDF04F1660102231022081F0BF03BF905 -:1054C00080F8008031794170E3E6A07F00F00300AE -:1054D000012806D0002150460BF0C0FA050003D188 -:1054E00001E00121F7E7FFDF95F8880000F00300F5 -:1054F000012879D1A07F00F00307E07FC0F34006C8 -:1055000016B1012F04D02BE095F8A400C0072AD0D3 -:10551000D5F8C00118B395F88720017C62F38701A4 -:105520000174E27FD5F8C00162F341010174D5F83E -:10553000C00166F300010174AEB1D5F8C0011022BC -:1055400004F124018C351CF0D7FA287E40F00100CC -:105550002876287820F0010005F88C0900E016B1C3 -:10556000022F04D02CE095F88C00C00726D0D5F887 -:10557000BC1119B395F88720087C62F38700087482 -:10558000E27FD5F8BC1162F341000874D5F8BC1174 -:1055900066F3000008748EB1D5F8BC01102204F146 -:1055A00024018C351CF0A8FA287840F0010005F899 -:1055B000180B287820F0010005F8A409022F44D028 -:1055C0005FF0000000EB400005EBC00090F88C009D -:1055D000800709D595F88000D5F8C421400805F169 -:1055E00081011032FDF711FF05208DF8000095F8BC -:1055F00088006A4600F003008DF8010095F88C10D1 -:105600008DF8021095F8A4008DF80300214650464D -:1056100001F046FA2078252805D0212807D0FFDFA1 -:105620002078222803D922212046FDF79BFDA07F68 -:1056300000F0030001280AD0002150460BF020FAA8 -:1056400000283FF432AEFFDF23E60120BAE7012154 -:10565000F3E7716881F801801BE6FFDF19E670B59A -:105660006A4C0025103C04F85C5F65600CF07FFD1F -:105670006649A1F1100003F02AFE04F82C5C062014 -:10568000607262487C3020615030A0611030E0616F -:1056900070BD70B50D46FDF72DFD040000D1FFDF94 -:1056A0004FF4E87128461CF0C0FA5848543068613D -:1056B00004F124002861A07F00F00300012809D034 -:1056C0005FF0020105F59A700CF052FD002800D041 -:1056D000FFDF70BD0121F5E70A46014602F59A7029 -:1056E0000CF066BD70B5054640689CB0017809298C -:1056F00006D00C2937D00D2933D0FFDF1CB070BD88 -:1057000046883046FDF7F6FC040000D1FFDF207824 -:105710002128F3D0282821D1686802210C3001F01B -:10572000B4F9D8B168680821001D01F0AEF9A8B13C -:105730002D208DF80000ADF80260102204F1240144 -:1057400001A81CF0D9F90BA9684608F083FC00B148 -:10575000FFDF29212046FDF705FDCFE703F028FEF6 -:10576000CCE701218171686886883046FDF7C2FC6C -:10577000040000D1FFDFA07F00F00301022902D165 -:1057800020F01000A077207821280AD0686881795D -:1057900009B1807880B1A07F00F0030002285ED0BC -:1057A000FFDFA07F00F003000228A7D1FDF7B3FEC2 -:1057B0000028A3D0FFDFA1E703F0FAFDE07FC107D7 -:1057C00028D0800705D594F8200000F01F0010288D -:1057D0001ED0052084F82300207829281CD02428F6 -:1057E000DFD1314605200EF0EFFC22212046FDF7E7 -:1057F000B9FCA07F00F0030001282ED00021304624 -:105800000BF03EF90028CCD0FFDFCAE728020020C9 -:105810000620DFE70420DDE7A07F00F00300012879 -:1058200006D0002130460BF019F9050003D101E044 -:105830000121F7E7FFDF25212046FDF793FC0F202C -:105840008DF8580016A905F59A700CF0A8FC0228EE -:10585000A7D00028A5D0FFDFA3E70121CFE703F001 -:10586000A7FD9EE72DE9F0438BB099461546884683 -:105870000646FDF73FFC04004FD0207822284CD389 -:1058800023284AD0E07FC00647D4A07F00F0030061 -:10589000012806D0002130460BF0E0F8070002D0C6 -:1058A0000CE00121F7E7A07F00F00300012805D1FB -:1058B0000121002230460BF0C8F8074601AB02AACE -:1058C00003A93846FFF706FC039800B9FFDF4FB184 -:1058D000039807F59A7787612078222806D0242834 -:1058E00004D007E003990020886103E025212046C9 -:1058F000FDF738FC03980B21417046628580C0E9B2 -:105900000289029901610199416104A90CF062FCCC -:10591000022802D0002800D0FFDF0BB0BDE8F083E2 -:1059200070B586B00546FDF7E5FB017822291CD944 -:10593000807F00F00300012806D0002128460BF0EC -:105940008DF8040030D101E00121F7E7FFDF2BE003 -:10595000B4F8620004F1660630440178427831B14F -:1059600021462846FFF7E9FBB8B906B070BDADF88F -:1059700004200921284602AB04F059FB03900028BB -:10598000F3D011208DF80000694604F59A700CF0F0 -:1059900006FC022801D000B1FFDF022310223146AD -:1059A00004F162000AF0FDFEB4F864000028CFD1D3 -:1059B000DBE710B586B00446FDF79CFB0178222991 -:1059C00019D9807F00F00300012806D0002120466D -:1059D0000BF044F8040003D101E00121F7E7FFDFF9 -:1059E00012208DF80000694604F59A700CF0D7FB80 -:1059F000002800D0FFDF06B010BD2DE9F05F05469E -:105A00000C4600270078904601093E46BA4604F14C -:105A1000080B02297ED0072902D00A2909D142E0C9 -:105A200068680178092905D00C292CD00D292AD0C5 -:105A3000FFDFB2E114271C26002C6CD04088A08028 -:105A4000FDF758FB5FEA000900D1FFDF99F8170066 -:105A50005A46400809F11801FDF7D7FC68688089AB -:105A6000208269684868C4F812008868C4F8160083 -:105A7000A07E20F0060040F00100A07699F81E00FC -:105A800040F040014DE01A270A26002CD5D080882E -:105A9000A080FDF72FFB050000D1FFDF5946284607 -:105AA000FFF7E9FA79E10CB1A88BA080287A0D28DC -:105AB0007ED006DC01287CD0022808D0032804D13F -:105AC00035E00F2876D0102875D0FFDF65E11E275E -:105AD0000926002CB1D0A088FDF70CFB5FEA000975 -:105AE00000D1FFDF287B00F003000128207A1BD0C3 -:105AF00020F001002072297B890861F341002072A7 -:105B0000297BC90861F382002072297B090961F3AE -:105B1000C30001E036E1E9E0207299F81E0040F090 -:105B2000800189F81E1038E140F00100E2E71327F8 -:105B30000D26002CAAD0A088FDF7DCFA8146807FD4 -:105B400000F00300012806D00021A0880AF086FF9B -:105B5000050003D101E00121F7E7FFDF99F81E00FE -:105B600000F00302012A59D0E86F817801F00301A7 -:105B70000129217A54D021F00101217283789B08F8 -:105B800063F3410121728378DB0863F382012172A0 -:105B900083781B0963F3C3012172037863F3061151 -:105BA0002172437863F3C711217284F809A003E0DE -:105BB0005EE0A4E08BE09CE0C178A172012A32D0C3 -:105BC0004279E17A62F30001E1724279520862F3AC -:105BD0004101E1724279920862F38201E1724279F5 -:105BE000D20862F3C301E1720279217B62F3000102 -:105BF00021730279520862F34101217302799208FC -:105C000062F3820121730079C00860F3C30121733C -:105C100099F80000232859D9262168E0A86FA4E745 -:105C200041F00101A9E70279E17A62F30001E17232 -:105C30000279520862F34101E1720279920862F33B -:105C40008201E1720279D20862F3C301E172427902 -:105C5000217B62F3000121734279520862F3410112 -:105C600021734279920862F3820121734079CBE774 -:105C700018271026D4B3A088FDF73CFA8346807F0E -:105C800000F00300012807D00021A0880AF0E6FEFA -:105C90005FEA000903D101E00121F6E7FFDFE868D0 -:105CA000A06099F8000040F0040189F8001099F80C -:105CB0000100800708D5012020739BF800002328ED -:105CC0006BD9272158464FE084F80CA065E01527D2 -:105CD0000F265CB1A088FDF70DFA814606225946D1 -:105CE000E86808F01FFA0120A0739BE03FE04846F7 -:105CF0003AE016270926D4B3287B20724DE0287B92 -:105D000019270E269CB3C4F808A0A4F80CA00128FB -:105D100007D0022805D0032805D0042803D0FFDFD0 -:105D20000DE0207207E0697B042801F00F0141F0CB -:105D3000800121721CD0607A20F003006072A0887C -:105D4000FDF7D8F905460078212826D0232800D071 -:105D5000FFDFA87F00F00300012811D00021A088F8 -:105D60000AF08EFE22212846FDF7FCF915E004E03A -:105D7000607A20F00300401CE0E7A8F8006011E022 -:105D80000121ECE70CB16888A080287A03282BD089 -:105D900004280AD005284BD0FFDFA8F800600CB11A -:105DA000278066800020BDE8F09F15270F26002C75 -:105DB000E3D0A088FDF79EF9807F00F00300012862 -:105DC00006D00021A0880AF049FE050003D101E0B9 -:105DD0000121F7E7FFDFD5F821000622594608F038 -:105DE000A1F984F80EA0D8E717270926002CC4D003 -:105DF000A088FDF77FF98146807F00F0030001282D -:105E000006D00021A0880AF029FE050003D101E098 -:105E10000121F7E7FFDF6878800701D5022000E065 -:105E20000120207299F800002328B6D927215EE7C7 -:105E300019270E26002CA0D0A088FDF75BF95FEA99 -:105E4000000900D1FFDFC4F808A0A4F80CA084F872 -:105E500008A0A07A40F00300A07299F81F1061F327 -:105E60008200A07299F81F10C1F34002114205D0C0 -:105E700099F8201001F01F0110292CD020F0080003 -:105E8000A07299F81F004108607A61F3C300607244 -:105E9000697A01F003010129A5D140F00400607284 -:105EA00099F81E00E97A00F00300012816D0607B03 -:105EB00061F300006073AA7A217B62F30001217311 -:105EC000EA7A520862F341006073A87A400860F3EE -:105ED0004101217361E740F00800D1E7207B61F3C5 -:105EE00000002073AA7A617B62F300016173EA7A91 -:105EF000520862F341002073A87A400860F3410120 -:105F000061734AE710B5FE4C30B10146102204F12E -:105F100020001BF0F1FD012084F8300010BD10B509 -:105F20000446FFF724F8F64920461022BDE8104049 -:105F300020311BF0E1BD70B5F14D06004FF00004BB -:105F400012D00EF08DF908B110240BE00621304676 -:105F500008F0CFF8411C04D02866012085F85C00C9 -:105F600000E00724204670BD0020F7E7007810F01D -:105F70000F0204D0012A05D0022A0CD110E000093A -:105F800009D10AE00009012807D0022805D003281A -:105F900003D0042801D00720704708700020704704 -:105FA0000620704705282AD2DFE800F003070F1704 -:105FB0001F00087820F0FF001EE0087820F00F0096 -:105FC000401C20F0F000103016E0087820F00F00A0 -:105FD000401C20F0F00020300EE0087820F00F0088 -:105FE000401C20F0F000303006E0087820F00F0070 -:105FF000401C20F0F000403008700020704707205F -:1060000070472DE9F041804688B00D4600270846CC -:106010000EF073F9A8B94046FDF76CF8040003D000 -:106020002078222815D104E043F2020008B0BDE830 -:10603000F08145B9A07F010603D500F003000228D6 -:1060400001D01020F2E7A07FC10601D4010702D5DC -:106050000DB10820EAE7E17FC90601D50D20E5E78B -:1060600000F00300022805D125B12846FEF7F2FE14 -:106070000700DBD1A07F00F00300012806D000213B -:1060800040460AF0EBFC060002D00DE00121F7E7E4 -:10609000A07F00F0030001280CD000210022404620 -:1060A0000AF0D3FC060007D0A07F00F0030002280E -:1060B00004D009E00121F1E70420B7E725B12A4621 -:1060C00031462046FEF7EAFE07AB1A4669463046DF -:1060D000FFF700F8009800B9FFDF00990C20487026 -:1060E00006F59A70C1F82480486100200881A07FDD -:1060F00000F00300012828D0EDB302200871301D04 -:1061000088613078400908777078C0F3400048779C -:10611000287800F00102887F62F301008877E27F2F -:1061200062F382008877E27F520862F3C3008877C7 -:10613000727862F304108877A878C87701F1210299 -:1061400028462031FEF7CAFE22E001200871287897 -:1061500000F00102087E62F3010008762A785208F6 -:1061600062F3820008762A78920862F3C300087608 -:106170002A78D20800E007E062F3041008762421B0 -:106180002046FCF7EFFF0BE003200871052008769E -:1061900025212046FCF7E6FFA07F20F08000A077B5 -:1061A00001A900980CF016F8022801D000B1FFDF19 -:1061B00038463BE72DE9FF4F524A0D4699B09A46C3 -:1061C00007CA14AB002783E807001998FCF792FF71 -:1061D000060006D03078262806D008201DB0BDE87D -:1061E000F08F43F20200F9E7B07F00F00309B9F144 -:1061F000010F03D0B9F1020F07D008E03DB91B9899 -:10620000FEF728FE0028E9D101E01B9880BBB07F93 -:1062100000F00300012806D0002119980AF01EFCA6 -:10622000040003D101E00121F7E7FFDF852D28D02D -:1062300007DCF5B1812D1ED0822D1ED0832D08D113 -:106240001DE0862D1FD0882D1FD0892D1FD08A2DAF -:106250001FD00F2020710F281DD003F0A6F8E0B149 -:1062600001208DF83400201D0E902079B8B160E136 -:1062700011E00020EEE70120ECE70220EAE703202E -:10628000E8E70520E6E70620E4E70820E2E7092042 -:10629000E0E70A20DEE70720A0E711209EE7B9F13A -:1062A000010F17D0D4E91E50804602200190012032 -:1062B0000090A87898F80210C0F3C000C1F3C001A4 -:1062C00008405FEA000B63D050460DF0C9FF00287C -:1062D00072D133E0D4E91E850120019002200090A4 -:1062E000214630461B9AFEF7D9FD1B98007800F036 -:1062F0000101A87861F30100A870F17F04E00000BB -:10630000180200202420020061F38200A870F17FAF -:10631000490861F3C300A870617861F30410A870A4 -:106320002078400928706078C0F3400068701B989E -:106330008078E870002068712871BAE7DAF80C00FC -:106340000DF08EFFC0BBDAF81C000DF089FF98BB82 -:10635000DAF80C00A060DAF81C00E06098F80100A0 -:10636000617800F0010041EA4000607098F8021086 -:10637000C0B2C1F30011891E08406070002084F88B -:106380002000009906F1170002290BD001210AE034 -:1063900098F80110607801F00101FD2242EA410104 -:1063A0000840E2E7002104EB810188610199701C3B -:1063B000022902D0012101E028E0002104EB810143 -:1063C0008861A87800F00300012849D198F80200FC -:1063D00000F00300012843D1B9F1010F04D12A1DB7 -:1063E000691D1B98FEF77AFD287998F8041008407B -:1063F0008DF82C00697998F8052011408DF830103F -:1064000008432DD050460DF02BFF08B11020E5E6D3 -:106410000AF1100004F5DE7104F190020490B9F164 -:10642000020F3CD00090CDE9012100210BAB5A4670 -:106430002046FEF7B0FD0028E9D104F5E07104F133 -:10644000A802B9F1010F30D004980090CDE90121E4 -:1064500000210CAB5A462046FEF79DFD0028D6D100 -:106460006078800740D4A87898F80210C0F38000C4 -:10647000C1F38001084337D0297898F8000014AAA6 -:10648000B9F1010F17D032F810204B00DA4012F0AA -:10649000030718D0012F1ED0022F12D11DE0CDF816 -:1064A00000A0CDE901210121C0E7CDF800A0CDE990 -:1064B00001210121CDE732F811204300DA4002F03A -:1064C0000307032F07D0BBF1000F0DD0012906D021 -:1064D000042904D008E00227F5E70127F3E70128A3 -:1064E00001D0042800D10427F07F40F001006BF3B5 -:1064F0004100F077607881074FF003000CD5A07160 -:10650000BBF1000F15D100BF8DF85C0017AA314612 -:10651000199800F0C5FA0CE00221022F18D0012FC3 -:1065200018D0042F22D00020A071F07F20F00100AD -:10653000F07725213046FCF715FE0DA904F59A7079 -:106540000BF02DFE10B1022800D0FFDF002045E641 -:10655000A171D9E7A1710D2104F124001BF065FBA5 -:10656000207840F0020020700420CDE70120A071C7 -:10657000DFE72DE9F04387B09046894604460025C1 -:10658000FCF7B8FD060006D03078272806D0082092 -:1065900007B0BDE8F08343F20200F9E7B07F00F0F6 -:1065A0000300012806D0002120460AF057FA040013 -:1065B00003D101E00121F7E7FFDFA7795FEA0900D6 -:1065C00005D0012821D0B9F1020F26D110E0B8F191 -:1065D000000F22D1012F05D0022F05D0032F05D0A7 -:1065E000FFDF2DE00C252BE0012529E0022527E027 -:1065F00040460DF035FEB0B9032F0ED110224146B2 -:1066000004F121001BF078FA1AE0012F02D0022FCA -:1066100003D104E0B8F1000F12D00720B8E74046DC -:106620000DF01EFE08B11020B2E7102104F1210088 -:106630001BF0D9FA0621404607F05BFDC4F82100A3 -:106640002078252140F0020020703046FCF78AFDBA -:106650002078C10714D020F00100207002208DF8AE -:10666000000004F1210002908DF80450694604F501 -:106670009A700BF094FD022804D018B1FFDF01E0FE -:1066800084F82050002083E730B587B00D460446DB -:10669000FCF730FD88B1807F00F0030001280FD0A7 -:1066A000002120460AF0DAF904000ED028460DF049 -:1066B000D7FD38B1102007B030BD43F20200FAE731 -:1066C0000121EEE72078400701D40820F3E72946AE -:1066D00004F14100202205461BF00EFA207840F01C -:1066E0001000207001070FD520F008002070132043 -:1066F0008DF80000694604F59A7001950BF04FFD86 -:10670000022801D000B1FFDF0020D4E770B50D46AC -:106710000646FCF7EFFC18B1017827291FD102E0EB -:1067200043F2020070BD807F00F00300012806D014 -:10673000002130460AF092F9040003D101E0012162 -:10674000F7E7FFDFA079022809D16078C00706D0FB -:106750002A4621463046FEF7F0FC10B10FE0082033 -:1067600070BDB4F864000E280BD204F16601022358 -:106770001022081F09F0DFFF012101704570002081 -:1067800070BD112070BD70B5064686B014460D462A -:1067900008460DF065FD18B920460DF087FD10B1D3 -:1067A000102006B070BDA6F57F40FF380ED03046F1 -:1067B000FCF7A0FC38B1417822464B08811C1846F2 -:1067C000FCF723FE07E043F20200EAE72046FDF76C -:1067D00099FC0028E5D11021E01D0DF012FAE21D10 -:1067E00029466846FEF791FC102204F11700019932 -:1067F0001BF082F90020D4E72DE9F041044686B071 -:1068000015468846002708460DF077FD18B928463A -:106810000DF073FD10B1102006B008E42046FCF71F -:1068200069FC060003D03078272818D102E043F233 -:106830000200F1E7B07F00F00300012806D000213C -:1068400020460AF00BF9040003D101E00121F7E72B -:10685000FFDF2078400702D56078800701D4082048 -:10686000DAE7B07F00F00300012818D0D4E91E0158 -:10687000407800B1B5B1487810B1B8F1000F11D02F -:10688000C5B1EA1D6846E168FEF73FFC102205F13C -:10689000170001991BF004F930B104270AE0D4E98C -:1068A0001E10E5E70720B7E71022E91D04F13100CB -:1068B0001BF022F9B8F1000F06D0102208F10701F1 -:1068C00004F121001BF018F92078252140F0020086 -:1068D00020703046FCF746FC2078C10716D020F027 -:1068E0000100207002208DF8000004F121000290C8 -:1068F000103003908DF80470694604F59A700BF01F -:106900004EFC022804D018B1FFDF01E084F82070AB -:10691000002081E7F8B515460E460746FCF7EAFB6E -:10692000040004D02078222804D00820F8BD43F2C7 -:106930000200F8BDA07F00F00300022802D043F25D -:106940000400F8BD30460DF08BFC18B928460DF058 -:1069500087FC08B11020F8BD00953288B31C214691 -:106960003846FEF70EFC112814D00028F3D1297CFC -:106970004A08E17F62F30001E1772A7C62F341017A -:10698000E177297C890884F82010A17F21F080011B -:10699000A177F8BDA17F0907FBD4D6F80200C4F89F -:1069A0003600D6F80600C4F83A003088A0861022D7 -:1069B000294604F124001BF09FF8287C4108E07F61 -:1069C00061F38200E077297C61F3C300E077287CE3 -:1069D000800884F82100A07F40F00800A077002004 -:1069E000D3E770B596B00D46064613B1072016B032 -:1069F00070BDFCF77FFB040007D02078222802D36B -:106A0000A07F400604D40820F1E743F20200EEE73D -:106A1000C5B12D208DF80000ADF802601022294686 -:106A200001A81BF069F8287C4108E07F61F30000B1 -:106A3000E077297C61F34100E077287C800884F8C6 -:106A4000200004E02E208DF80000ADF802600BA9B4 -:106A5000684607F0FFFAA17F21F04001A177C6E761 -:106A600070B50D46FCF746FB040005D028460DF036 -:106A70001DFC20B1102070BD43F2020070BD2946FC -:106A80002046FEF7F8FA002070BD04E010F8012B54 -:106A90000AB100207047491E89B2F7D20120704721 -:106AA00070B51546064602F080FC040000D1FFDFF9 -:106AB000207820F00F00801C20F0F00020302070A3 -:106AC00066802868A060BDE8704002F071BC0000DC -:106AD00018B18178012938D101E010207047018870 -:106AE00042F60112881A914231D018DC42F60102B6 -:106AF000A1EB020091422AD00CDC41B3B1F5C05F9A -:106B000025D06FF4C050081821D0A0F57060FF3870 -:106B10001BD11CE001281AD002280AD117E0B0F5D9 -:106B2000807F14D008DC012811D002280FD0032860 -:106B30000DD0FF2809D10AE0B0F5817F07D0A0F57C -:106B40008070033803D0012801D0002070470F2047 -:106B500070470B2826D008DC1BD2DFE800F01C2091 -:106B600025251A25292325271E0011281CD008DCDD -:106B70000C2817D00D281DD00F2815D0102808D1AB -:106B800010E0822809D0842810D0852810D08728CA -:106B900012D003207047002070470520704743F251 -:106BA00003007047072070470F207047042070478C -:106BB000062070470C20704743F20200704738B53A -:106BC0000C46050041D06946FFF7D0F9002819D1DD -:106BD0009DF80010607861F3020060706946681CDF -:106BE000FFF7C4F900280DD19DF80010607861F31B -:106BF000C5006070A978C1F34101012903D00229C1 -:106C000005D0072038BD217821F0200102E021784D -:106C100041F020012170410704D0A978C90861F32F -:106C200086106070607810F0380F07D0A9780909D5 -:106C300061F3C710607010F0380F02D16078400621 -:106C400003D5207840F040002070002038BD70B59A -:106C500004460020088015466068FFF7B0FF002852 -:106C600016D12089A189884211D860688078C00730 -:106C70000AD0B1F5007F0AD840F20120B1FBF0F252 -:106C800000FB1210288007E0B1F5FF7F01D90C202E -:106C900070BD01F201212980002070BD10B504787B -:106CA000137864F3000313700478640864F34103F9 -:106CB00013700478A40864F3820313700478E40862 -:106CC00064F3C30313700478240964F3041313708A -:106CD0000478640964F3451313700078800960F345 -:106CE0008613137031B10878C10701D1800701D52F -:106CF000012000E0002060F3C713137010BD42783C -:106D0000530702D002F0070306E012F0380F02D05A -:106D1000C2F3C20300E001234A7863F302024A701F -:106D2000407810F0380F02D0C0F3C20005E04307EE -:106D300002D000F0070000E0012060F3C5024A70B5 -:106D400070472DE9F04F95B00D00804615D0B8F191 -:106D5000000F16D0122128461AF045FF4FF6FF7B90 -:106D600005AA0121584606F0C0FF002426463746F2 -:106D70004FF420596FF4205A75E0102015B0BDE88B -:106D8000F08F0720FAE700BF9DF81E0001280AD106 -:106D9000BDF81C0048450BD010EB0A000AD00128B2 -:106DA0000CD002280CD0042C0ED0052C0FD10DE0F5 -:106DB000012400E00224BDF81A6008E0032406E084 -:106DC0000424BDF81A7002E0052400E00624BDF892 -:106DD0001A10414547D12C74BEB34FF0000810AAD9 -:106DE0004FF0070ACDE90282CDE900A80DF13C0978 -:106DF0001023CDF8109042463146584607F028F847 -:106E000008BBBDF83C002A46C0B210A90BF084FABA -:106E1000C8B9AE81CFB1CDE900A80DF1080C0AAE1A -:106E200040468CE84102132300223946584607F0B9 -:106E30000FF840B9BDF83C00F11CC01EC0B22A1DBD -:106E40000BF06AFA10B1032098E70AE0BDF82900B8 -:106E5000E881062C05D19DF81E00A872BDF81C0023 -:106E6000288100208AE705A806F04BFF00288BD078 -:106E7000FFF76FFE82E72DE9F0471C46DDE9097850 -:106E8000DDF8209015460E00824600D1FFDF0CB1E0 -:106E9000208818B1D5B11120BDE8F087022D01D0AE -:106EA000012100E0002106F1140005F003FEA8F81E -:106EB000000002463B462946504603F0B8F8C9F8A0 -:106EC000000008B9A41C3C600020E5E71320E3E7BC -:106ED000F0B41446DDE904528DB1002314B1022C44 -:106EE00009D101E0012306E00D7CEE0703D025F077 -:106EF000010501230D742146F0BC03F02EBF1A805A -:106F0000F0BC70472DE9FE4F91461A881C468A4610 -:106F10008046FAB102AB494603F089F8050019D062 -:106F20004046A61C278809F0B5FE324607262946AA -:106F30003B46009609F074FA20882346CDE90050BC -:106F40004A4651464046FFF7C3FF002020800120FB -:106F5000BDE8FE8F0020FBE72DE9F04786B09146A3 -:106F6000DDE90E460F46824603AA05A904A8109D36 -:106F70008DE807009846324621465046FFF77BFFD2 -:106F8000049909B1012200E000222A70002817D1DB -:106F9000F84A03AB1060059A009104F11400CDE9A2 -:106FA00001204A463946504606F048F990B1082873 -:106FB0000ED2DFE800F00407040D0D090B0B0020D2 -:106FC00006B069E71120FBE70720F9E70820F7E79B -:106FD0000320F5E7BDF80C100498CDE90001434605 -:106FE000324621465046FFF773FFE8E72DE9F043AC -:106FF00089B00D46DDE9108781461C4616461421EE -:1070000003A81AF012FE012002218DF810108DF84D -:107010000C008DF81170ADF8146064B1A278D2073D -:1070200009D08DF81600E088ADF81A00A088ADF8F8 -:107030001800A068079008A80095CDE90110424605 -:1070400003A948466B68FFF787FF09B0BDE8F083E6 -:10705000F0B58BB0002406460694079407270894E1 -:1070600005A80994019400970294CDE903400D46C8 -:1070700010232246304606F0EBFE78B90AA806A98E -:10708000019400970294CDE90310BDF8143000225A -:107090002946304606F0B2FC002801D0FFF759FD22 -:1070A0000BB0F0BD06F052BB2DE9FC410C4680460A -:1070B000002602F07AF9054620780D287ED2DFE816 -:1070C00000F0BC0713B325BD49496383AF959B000E -:1070D000A848006820B1417841F010014170ADE04E -:1070E000404602F092F9A9E00421404609F0B6FCBE -:1070F000070000D1FFDF07F11401404605F06EFCE8 -:10710000A5BB13214046FDF787FB97E004214046CD -:1071100009F0A4FC070000D1FFDFE088ADF8000013 -:107120000020B8819DF80000010704D5C00602D5F3 -:10713000A088B88105E09DF8010040067ED5A088B2 -:10714000F88105B9FFDF22462946404601F068FC78 -:10715000022673E0E188ADF800109DF801100906E1 -:107160000FD5072803D006280AD00AE024E004211E -:10717000404609F073FC060000D1FFDFA088F081D3 -:107180000226CDB9FFDF17E00421404609F066FC76 -:10719000070000D1FFDF07F1140006F00EFB90F0AE -:1071A000010F02D1E079000648D5387C022640F074 -:1071B0000200387405B9FFDF224600E03DE02946B1 -:1071C000404601F02DFC39E00421404609F046FC20 -:1071D000017C002D01F00206C1F340016171017CC8 -:1071E00021F002010174E7D1FFDFE5E7022601216A -:1071F000404602F045F921E00421404609F02EFC0A -:107200000546606800902089ADF8040001226946B7 -:10721000404602F056F9287C20F0020028740DE068 -:10722000002DC9D1FFDFC7E7022600214046FBF74A -:10723000CDF8002DC0D1FFDFBEE7FFDF3046BDE84F -:10724000FC813EB50C0009D001466B4601AA002026 -:1072500006F080FE20B1FFF77CFC3EBD10203EBD55 -:1072600000202080A0709DF8050002A900F0070012 -:10727000FEF798FE50B99DF8080020709DF80500B3 -:1072800002A9C0F3C200FEF78DFE08B103203EBD87 -:107290009DF8080060709DF80500C109A07861F3B1 -:1072A0000410A0709DF80510890961F3C300A07057 -:1072B0009DF80410890601D5022100E0012161F347 -:1072C00042009DF8001061F30000A07000203EBD58 -:1072D00070B5144606460D4651EA040005D075B156 -:1072E00008460DF001F878B901E0072070BD294685 -:1072F000304606F090FE10B1BDE8704029E454B16C -:1073000020460CF0F1FF08B1102070BD2146304638 -:10731000BDE8704095E7002070BD2DE9FC5F0C468C -:1073200090460546002701780822007A3E46B2EBD7 -:10733000111F7DD104F10A0100910A31821E4FF024 -:10734000020A04F1080B0191092A72D2DFE802F067 -:10735000EDE005F528287BAACE006888042109F015 -:107360007DFB060000D1FFDFB08928B15227072638 -:10737000C3E000001403002051271026002C7DD00C -:107380006888A0800120A071A88900220099FFF7D9 -:107390009FFF002873D1A8892081288AE081D1E04D -:1073A000B5F81290072824D1E87B000621D5512793 -:1073B00009F1140086B2002CE1D0A88900220099BE -:1073C000FFF786FF00285AD16888A08084F806A0BD -:1073D000A88920810120A073288A2082A4F8129015 -:1073E000A88A009068884B46A969019A01F0F5FACD -:1073F000A8E0502709F1120086B2002C3ED0A889DF -:1074000000225946FFF764FF002838D16888A08021 -:10741000A889E080287A072813D002202073288AC0 -:10742000E081E87BC0096073A4F81090A88A01E0AD -:1074300085E082E0009068884B4604F11202A96959 -:10744000D4E70120EAE7B5F81290512709F11400BA -:1074500086B2002C66D06888042109F0FFFA8346C2 -:107460006888A080A88900220099FFF731FF0028D2 -:107470006ED184F806A0A889208101E052E067E07F -:107480000420A073288A2082A4F81290A88A009071 -:1074900068884B46A969019A01F09FFAA989ABF85F -:1074A0000E104FE06888FBF725FE07466888042128 -:1074B00009F0D4FA064607B9FFDF06B9FFDF687B9B -:1074C000C00702D05127142601E0502712264CB3E2 -:1074D0006888A080502F06D084F806A0287B5946E3 -:1074E00001F08BFA2EE0287BA11DF9E7FE49A8895F -:1074F0004989814205D1542706269CB16888A0801D -:1075000020E053270BE06888A080A889E08019E07C -:107510006888042109F0A2FA00B9FFDF5527082680 -:10752000002CF0D1A8F8006011E056270726002CA7 -:10753000F8D06888A080002013E0FFDF02E0012877 -:1075400008D0FFDFA8F800600CB12780668000201B -:10755000BDE8FC9F57270726002CE3D06888A08051 -:10756000687AA071EEE7401D20F0030009B14143A5 -:10757000091D01EB4000704713B5DB4A0020107174 -:10758000009848B10024684609F06BF8002C02D13D -:10759000D64A009911601CBD01240020F4E770B5A3 -:1075A0000D46064686B014465C2128461AF03DFB7F -:1075B00004B9FFDFA0786874A2782188284601F01A -:1075C00046FA0020A881E881228805F1140130469E -:1075D00005F0E9F96A460121304606F086FB19E01C -:1075E0009DF80300000715D5BDF806103046FFF7DB -:1075F0002FFD9DF80300BDF8061040F010008DF837 -:107600000300BDF80300ADF81400FF233046059ACF -:1076100006F0CCFC684606F074FB0028E0D006B00B -:1076200070BD10B50C4601F1140005F0F3F90146E8 -:10763000627C2046BDE8104001F03EBA70B50546B8 -:10764000042109F00BFA040000D1FFDF04F114015A -:107650000C46284605F0C2F921462846BDE8704090 -:1076600005F0C3B970B58AB00C460646FBF742FD7B -:10767000050014D02878222827D30CB1A08890B117 -:1076800001208DF80C0003208DF8100000208DF8EB -:10769000110054B1A088ADF81800206807E043F24B -:1076A00002000AB070BD0920FBE7ADF81800059094 -:1076B0000421304609F0D2F9040000D1FFDF04F1C3 -:1076C000140005F0BEF9C00601D40820E9E701F076 -:1076D0006CFE60B108A802210094CDE9011095F874 -:1076E000232003A930466368FFF736FCD9E7112051 -:1076F000D7E72DE9F04FB2F802A0834689B01546CE -:1077000089465046FBF7F6FC07460421504609F02F -:10771000A5F90026044605964FF002080696ADF836 -:107720001C6007B9FFDF04B9FFDF4146504603F094 -:107730007CFE60B907AA06A905A88DE807004246A5 -:10774000214650466368FFF796FB00B1FFDF6648AD -:1077500007AB0660DDE9051204F11400CDF80090D6 -:10776000CDE90320CDE9013197F823205946504651 -:107770006B6805F0AFF906000AD0022E04D0032E84 -:1077800014D0042E00D0FFDF09B03046BDE8F08FE2 -:10779000BDF81C000028F7D00599CDE9001042463D -:1077A000214650466368FFF793FBEDE7687840F0A9 -:1077B00008006870E8E72DE9F04F9BB004464FF0F1 -:1077C00000084948ADF85480ADF83080ADF85080DD -:1077D000A0F80880ADF81480ADF81880ADF82080CE -:1077E000ADF81C80007916460D464746012808D0A2 -:1077F000022806D0032804D0042802D008201BB099 -:10780000C4E720460CF02CFDD0BB28460CF028FD28 -:10781000B0BB60680CF071FD90BB606848B16089D6 -:107820002189884202D8B1F5007F01D90C20E6E712 -:1078300080460BAA06A92846FFF709FA0028DED1E0 -:1078400068688078C0F34100022808D19DF81900CB -:1078500010F0380F03D028690CF046FD80B905A957 -:107860002069FFF7ACF90028C9D1206950B16078D0 -:1078700080079DF8150000F0380002D5C0B301E084 -:1078800011E0A8BB9DF8140080060ED59DF81500E8 -:1078900010F0380F03D060680CF026FD18B960684E -:1078A0000CF02BFD08B11020A9E707A96069FFF7CC -:1078B00086F90028A3D1606940B19DF81D0000F051 -:1078C000070101293FD110F0380F3CD008A9A06969 -:1078D000FFF775F9002892D19DF81C00800632D47C -:1078E0009DF82000800604E014030020140000200E -:1078F00029E028D4A06940B19DF8210000F00701DB -:10790000012920D110F0380F1DD0E06818B100789F -:10791000C8B11C2817D20EAA611C2046FFF7BEF979 -:107920000120B94660F30F27BA4607468DF84E008E -:1079300042F60300ADF84C000DF13B0217A9286890 -:107940000AF009FD08B1072059E79DF85C0016A967 -:10795000CDF80090C01CCDE9019100F0FF0B002391 -:107960000BF20122514613A806F002F9F0BBBDF854 -:1079700058000990FE482A8929690092CDE9011032 -:107980006B89BDF82C202868069906F0F1F80100F3 -:107990007ED120784FF0020AC10601D480062BD593 -:1079A000ADF80C90606950B907A906A8FFF7A7F9D0 -:1079B0009DF81D0020F00700401C8DF81D009DF86B -:1079C0001C008DF84E7040F0C8008DF81C0042F687 -:1079D0000210ADF84C000CA903AACDF800A0CDE927 -:1079E0000121002340F2032213A800E01EE00799C2 -:1079F00006F0BEF801004BD1DD484D4608385B4625 -:107A00000089ADF839000EA8CDE90290CDF80490B8 -:107A1000CDF810904FF007090022CDF80090BDF886 -:107A200058104FF6FF7005F0E9FF10B1FFF791F81D -:107A3000E5E69DF83800000625D52946012060F3CB -:107A40000F218DF84E704FF42450ADF84C00ADF876 -:107A5000105062789DF81000002362F300008DF84A -:107A600010006278CDF800A0520862F341008DF852 -:107A7000100004AACDE9012540F2032213A806F064 -:107A800077F8010004D1606888B32069A8B900E0E4 -:107A900086E005A906A8FFF732F96078800706D4CA -:107AA0009DF8150020F038008DF8150005E09DF8D0 -:107AB000140040F040008DF814008DF84E7042F62E -:107AC0000110ADF84C00208940F20121B0FBF1F229 -:107AD00001FB1202606814ABCDF80080CDE9010310 -:107AE000002313A8059906F043F8010058D1207827 -:107AF000C00729D0ADF80C50A06950B908A906A854 -:107B0000FFF7FDF89DF8210020F00700401C8DF8DC -:107B100021009DF820008DF84E7040F040008DF857 -:107B2000200042F60310ADF84C0015A903AACDF8C9 -:107B300000A0CDE90121002340F2032213A80899F7 -:107B400006F016F801002BD1E06868B32946012041 -:107B500060F30F218DF84E7042F60410ADF84C0022 -:107B6000E068002302788DF8602040788DF861008D -:107B7000E06818AA4088ADF86200E06800798DF8E6 -:107B80006400E068C088ADF86500CDF80090CDE9EC -:107B900001254FF4027213A805F0EAFF010003D09B -:107BA000099800F0B5FF2AE67148032108380171F1 -:107BB00056B100893080BDF850007080BDF83000AB -:107BC000B080BDF85400F080002018E670B50125A3 -:107BD0008AB016460B46012802D0022816D104E0CE -:107BE0008DF80E504FF4205003E08DF80E5042F601 -:107BF0000100ADF80C005BB10024601C60F30F24A1 -:107C000004AA08A918460AF0A6FB18B1072048E5FF -:107C1000102046E504A99DF820205548CDE9002113 -:107C2000801E02900023214603A802F2012205F0E3 -:107C30009FFF10B1FEF78DFF33E54D4808380EB1B8 -:107C4000C1883180057100202BE5F0B593B007465F -:107C500001268DF83E6041F60100ADF83C0012AA05 -:107C60000FA93046FFF7B2FF002848D1404C00254D -:107C7000083CE7B31C2102A819F0D7FF9DF80800C3 -:107C80008DF83E6040F020008DF8080042F6052097 -:107C9000ADF83C000E959DF83A00119520F00600D5 -:107CA000801C8DF83A009DF838006A4620F0FF00ED -:107CB0008DF838009DF8390009A920F0FF008DF8F3 -:107CC00039000420ADF82C00ADF830000EA80A9061 -:107CD00011A80D900FA80990ADF82E5002A8FFF73B -:107CE0006AFD00280BD1BDF80000608100E008E0CB -:107CF000BDF80400A081401CE0812571002013B074 -:107D0000F0BD6581A581BDF84800F4E72DE9F74F86 -:107D10001749A0B00024083917940A79A146012A0E -:107D200004D0022A02D0082023B02FE5CA8882425C -:107D300001D00620F8E721988A46824201D1072027 -:107D4000F2E701202146ADF848004FF6FF7860F3D6 -:107D50000F21ADF84A808DF86E0042F6020B0691B5 -:107D60008DF87240ADF86CB0ADF870401CA901E020 -:107D70001C0300201391ADF8508012A805F0E5FF18 -:107D800000252E462F460DAB072212A9404605F0CE -:107D9000DFFF78B182285DD195B38EB3ADF8645022 -:107DA000ADF866609DF85E008DF8144019AC0128AE -:107DB00064D06BE09DF83A001FB3012859D1BDF89B -:107DC000381059451FD118A809A901940294CDE98A -:107DD000031007200090BDF8361010230022404603 -:107DE00006F036F8B0BBBDF86000042801D00628C4 -:107DF0004AD1BDF82410219881423AD10F2093E74F -:107E00003AE0012835D1BDF83800B0F5205F03D045 -:107E100042F6010188422CD1BAF80600BDF83610AE -:107E2000884201D1012700E0002705B19EB12198C9 -:107E300081421ED118A809AA01940294CDE9032019 -:107E4000072000900D4610230022404606F000F85F -:107E500000B902E02DE04E460BE0BDF860000228BC -:107E600001D0102810D1C0B217AA09A90AF054FAFB -:107E700050B9BDF8369086E7052055E705A917A843 -:107E8000221D0AF068FA08B103204DE79DF814009E -:107E90000023001DC2B28DF8142022980092CDE973 -:107EA00001401BA8069905F063FE10B902228AF86A -:107EB0000420FEF74EFE37E710B50B46401E88B093 -:107EC00084B205AA00211846FEF7E8FE00200DF155 -:107ED000080C06AA05A901908CE80700072000906D -:107EE0000123002221464FF6FF7005F087FD04466E -:107EF000BDF81800012800D0FFDF2046FEF729FE5C -:107F000008B010BDF0B5F94F044687B038790E4679 -:107F1000032804D0042802D0082007B0F0BD04AA2A -:107F200003A92046FEF793FE0500F6D1606880782D -:107F3000C0F3410002280AD19DF80D0010F0380F5F -:107F400005D020690CF0D0F908B11020E5E72089B0 -:107F500005AA21698DE807006389BDF81020206813 -:107F6000039905F005FE10B1FEF7F3FDD5E716B154 -:107F7000BDF814003080042038712846CDE7F8B5EC -:107F80000C0006460BD001464FF6FF7500236A46EB -:107F9000284605F0DFFF20B1FEF7DBFDF8BD10201D -:107FA000F8BD69462046FEF70AFE0028F8D1A07801 -:107FB000314600F001032846009A05F0F7FFEBE791 -:107FC00030B587B0144600220DF1080C05AD0192C2 -:107FD0008CE82C00072200920A46014623884FF6BF -:107FE000FF7005F00BFDBDF814102180FEF7B1FD08 -:107FF00007B030BD70B50D46042108F02FFD040018 -:1080000000D1FFDF294604F11400BDE8704004F000 -:1080100011BD70B50D46042108F020FD040000D10B -:10802000FFDF294604F11400BDE8704004F025BDCF -:1080300070B50D46042108F011FD040000D1FFDFEA -:10804000294604F11400BDE8704004F03DBD70B550 -:108050000546042108F002FD040000D1FFDF21469F -:1080600028462368BDE870400122FEF74BBF70B57B -:108070000646042108F0F2FC040000D1FFDF04F101 -:10808000140004F0C7FC401D20F0030511E0011DA1 -:1080900000880022431821463046FEF733FF0028AF -:1080A0000BD0607CABB2684382B2A068011D08F0BF -:1080B00078FBA06841880029E9D170BD70B50546FC -:1080C000042108F0CBFC040000D1FFDF2146284644 -:1080D0006368BDE870400222FEF714BF70B50E461B -:1080E000054601F062F9040000D1FFDF0120207293 -:1080F00066726580207820F00F00001D20F0F000EF -:1081000040302070BDE8704001F052B910B504460F -:10811000012900D0FFDF2046BDE810400121FAF719 -:1081200055B92DE9F04F97B04FF0000A0C00834687 -:10813000ADF818A0D04619D0E06830B1A068A8B159 -:108140000188ADF81810A0F800A05846FAF7D2FF41 -:10815000070043F2020967D03878222862D304214D -:10816000584608F07BFC050005D103E0102017B04D -:10817000BDE8F08FFFDF05F1140004F04BFC401D5B -:1081800020F00306A078012803D0022801D00720A0 -:10819000EDE7208878B1401C81B209AA584605F065 -:1081A000A4FD09A805F0ADFD9DF82E204FF4505117 -:1081B000012A0DD102E043F20300D8E7BDF82C20DC -:1081C000A2F52453023B03D1822801D0A0B901E0DB -:1081D0000846CCE7E068B0B1CDE902A0072006AAC6 -:1081E000CDF804A000900492A2882188BDF8183030 -:1081F000584605F003FC10B1FEF7ABFCB7E7A168E9 -:10820000BDF8180008809DF82700C00602D543F28B -:108210000140ACE70D9838B1A1780078012905D06C -:1082200080071AD40820A2E74846A0E7C007F9D083 -:1082300002208DF83C00A8684FF00009A0B1697CCD -:108240004288714391420FD98AB2B3B2011D08F03E -:108250005EFA8046A0F800A006E003208DF83C00FE -:10826000D5F800804FF001099DF8280010F0380F74 -:1082700000D1FFDF9DF828001D49C0F3C20008446B -:1082800097F8231010F8010C884201D90F206EE7EF -:108290002088ADF8400014A90095CDE9019143462E -:1082A00007220FA95846FEF757FE002885D19DF8F2 -:1082B000500050B9A078012807D1687CB3B2704350 -:1082C00082B2A868011D08F036FA00204FE770B5A9 -:1082D000064615460C460846FEF7FAFB002809D16B -:1082E0002A4621463046BDE870406FE41403002062 -:1082F0002E20020070BD09E570B51E4614460D0023 -:1083000009D044B1616831B138B1F849C9888142B6 -:1083100003D0072070BD102070BD2068FEF7D8FB89 -:108320000028F9D1324621462846BDE87040FFF7C3 -:1083300042BA70B515460C0006D038B1EB49098930 -:10834000814203D0072070BD102070BD2068FEF769 -:10835000BFFB0028F9D129462046BDE87040D1E591 -:1083600070B5064686B00D46144610460BF09EFFCB -:10837000D0BB60680BF0C1FFB0BBA6F57F40FF38F3 -:1083800003D03046FAF7B6FE80B128466946FEF7BC -:10839000D8FC00280CD19DF810100F2008293CD2E1 -:1083A000DFE801F008060606060A0A0843F20200A2 -:1083B00006B070BD0320FBE79DF80210012908D12B -:1083C000BDF80010B1F5C05FF2D06FF4C052D142D9 -:1083D000EED09DF8061001290DD1BDF80410A1F5CD -:1083E0002851062907D200E028E0DFE801F0030366 -:1083F00004030303DCE79DF80A1001290ED1BDF840 -:108400000810B1F5245FD3D0A1F524510239CFD0A3 -:108410000129CDD0022901D1CAE7FFDF606878B910 -:10842000002305AA2946304605F094FD10B1FEF759 -:1084300090FBBDE79DF81400800601D41020B7E73B -:108440006188224628466368FFF7BAFDB0E72DE948 -:10845000F043814687B08846144610460BF026FF4D -:1084600018B1102007B0BDE8F083002306AA4146EA -:10847000484605F06FFD10B1FEF76BFBF2E79DF883 -:108480001800C00602D543F20140EBE7002507279C -:1084900005A8019500970295CDE9035062884FF633 -:1084A000FF734146484605F0D3FC060013D16068CF -:1084B0000BF0FCFE60B960680195CDE902500097B1 -:1084C0000495238862884146484605F0C1FC06466B -:1084D000BDF8140020803046CEE739B1834B0A88BE -:1084E0009B899A4202D843F20300704719E610B5FF -:1084F00086B07E4C0423ADF81430638943B1A4895F -:108500008C4201D2914205D943F2030006B010BD5E -:108510000620FBE7ADF81010002100910191ADF8A5 -:10852000003002218DF8021005A9029104A90391DF -:10853000ADF812206946FFF7F4FDE7E72DE9FC47A7 -:1085400081460E4608460BF08BFE88BB4846FAF77C -:10855000D1FD5FEA00080AD098F80000222829D34C -:108560000421484608F07AFA070005D103E043F2F7 -:108570000200BDE8FC87FFDF07F1140004F061FA98 -:1085800005463078012803D0022804D00720F0E700 -:10859000A8070FD502E015F0340F0BD0B079341DC9 -:1085A000C00709D0E08838B1A0680BF059FE18B1B7 -:1085B0001020DEE70820DCE732782088002628B388 -:1085C000A0F201130721112B18D20CD2DFE803F01F -:1085D0000B090D0B1D0B121D100B0B1D1D1D1D0B73 -:1085E0001D00022A11D10846C3E7012AFBD00CE086 -:1085F000EA0600E0AA06002AF5DA06E0A0F5C07255 -:108600001F2A02D97D3A022AEDD8C6B200F0CDFE6B -:1086100050B198F82300CDE90006FA89234639467F -:108620004846FEF7E3FCA4E71120A2E72DE9F04F4E -:108630008BB01F4615460C4683460026FAF75AFDB6 -:1086400028B10078222805D208200BB090E543F22B -:108650000200FAE7B80801D00720F6E7032F00D19F -:1086600000274FF6FF79CCB1022D72D320460BF0D4 -:1086700044FE30B904EB0508A8F101000BF03DFE03 -:1086800008B11020E1E7AD1EAAB22146484605F028 -:108690005AFD38F8021C88425BD1ADB21349B807C5 -:1086A00002D58889401C00E001201FFA80F8F807F5 -:1086B00001D08F8900E04F4605AA4146584605F093 -:1086C00014FB4FF0070A4FF00009D4B3204608E02E -:1086D000408810283DD8361D304486B2AE4238D28C -:1086E000A01902884245F3D353E000001403002090 -:1086F0009DF8170002074CD594B304EB0608361D0D -:10870000B8F80230B6B2102B23D89A19AA4220D852 -:10871000B8F8002091421CD1C0061CD5CDE900A9B3 -:108720000DF1080C0AAAA11948468CE80700B8F810 -:1087300000100022584605F061F920B1FEF709FA51 -:1087400083E726E005E0B8F80200BDF8281088426B -:1087500001D00B2079E7B8F80200304486B207E078 -:10876000FFE7C00604D55846FEF772FC002889D101 -:108770009DF81700BDF81A1020F010008DF81700B2 -:10878000BDF81700ADF80000FF235846009A05F029 -:108790000DFC05A805F0B5FA18B9BDF81A10B942D4 -:1087A000A6D90421584608F059F9040000D1FFDF8A -:1087B000A2895AB1CDE900A94D4600232146584669 -:1087C000FEF714FC0028BBD1A5813EE700203CE762 -:1087D0002DE9FF4F8BB01E4617000D464FF00004E9 -:1087E00012D0B00802D007200FB0C1E4032E00D190 -:1087F00000265DB108460BF077FD28B93888691E60 -:1088000008440BF071FD08B11020EDE7C64AB0072F -:1088100001D5D18900E00121F0074FF6FF7802D0A1 -:10882000D089401E00E0404686B206AA0B9805F0AB -:108830005CFA4FF000094FF0070B0DF1140A38E015 -:108840009DF81B00000734D5CDF80490CDF800B09A -:10885000CDF80890CDE9039A434600220B9805F025 -:10886000F7FA60BB05B3BDF814103A882144281903 -:10887000091D8A4230D3BDF81E2020F8022BBDF816 -:10888000142020F8022BCDE900B9CDE90290CDF8F3 -:1088900010A0BDF81E10BDF8143000220B9805F092 -:1088A000D7FA08B103209FE7BDF814002044001D4B -:1088B00084B206A805F025FA20B1822806D0FEF77A -:1088C00048F991E7BDF81E10B142B9D934B17DB174 -:1088D0003888A11C884203D20C2085E7052083E755 -:1088E00022462946404605F02EFC01462819018003 -:1088F000A41C3C80002077E710B504460BF0D6FCA2 -:1089000008B1102010BD8848C0892080002010BD0B -:10891000F0B58BB00D460646142103A819F085F971 -:1089200001208DF80C008DF8100000208DF811004A -:10893000ADF814503046FAF7DDFB48B10078222834 -:1089400012D30421304608F089F8040005D103E071 -:1089500043F202000BB0F0BDFFDF04F11400074644 -:1089600004F06FF8400601D40820F3E7207C0221D0 -:1089700040F00100207409A80094CDE901100722FD -:1089800003A930466368FEF7E7FA20B1217C21F0A5 -:1089900001012174DEE729463046F9F708FD08A9F0 -:1089A000384604F03DF800B1FFDFBDF82040172C39 -:1089B00001D2172000E02046A84201D92C4602E04F -:1089C000172C00D2172421463046FFF722FB214600 -:1089D0003046F9F708FA0020BCE7F8B51C46154602 -:1089E0000E46069F08F044F92346FF1DBCB23146EF -:1089F0002A46009407F0DBFCF8BD70B50C4605462E -:108A00000E21204619F0EFF8002020802DB1012D15 -:108A100001D0FFDF70BD062000E00520A07170BD11 -:108A200010B548800878134620F00F00001D20F094 -:108A3000F00080300C4608701422194604F108003A -:108A400019F09FF800F0B4FC3748046010BD2DE920 -:108A5000F047DFF8D890491D064621F0030117467C -:108A60000C46D9F8000007F01AFE050000D1FFDF20 -:108A70004FF000083560A5F800802146D9F80000C5 -:108A800007F00DFE050000D1FFDF7560A5F800803E -:108A90007FB104FB07F1091D0BD0D9F8000007F0E6 -:108AA000FEFD040000D1FFDFB460C4F80080BDE823 -:108AB000F087C6F80880FAE72DE9F0411746491D0E -:108AC00021F00302194D064601681446286807F094 -:108AD00011FE22467168286807F00CFE3FB104FBC6 -:108AE00007F2121D03D0B168286807F003FE0420C6 -:108AF00007F05EFF0446042007F062FF201A0128F9 -:108B000004D12868BDE8F04107F0BEBDBDE8F081A2 -:108B100010B50C4605F0B5F800B1FFDF2046BDE802 -:108B20001040FEF716B800001403002014000020C7 -:108B300010B50C460246817B808819B1518981426B -:108B400000D908462080D18800F0C5FF032800D353 -:108B50000320C1B22088BDE8104000F0B1BF10B5BD -:108B60000C460246817B808819B11189814200D967 -:108B700008462080D18800F0AEFF022800D30220F2 -:108B8000C1B2208800F09CFF401CC0B210BD2DE98E -:108B9000F04F0C00F84999B08146D1E90201CDE9C6 -:108BA0000C0109F10300F54E20F003010091357E20 -:108BB00005F1010504D1E8B209F054FB00B1FFDF73 -:108BC00000984FF0000B00EB0510C01C20F00301D3 -:108BD00000915CB9707A327A81F800B01044C2B268 -:108BE000B08B80B204F0D5FE00B1FFDF0098F169D0 -:108BF000084400902146684600F02CFF0098C01CF5 -:108C000020F003000090737A327AB17A04B1002028 -:108C100007F016FE0099084400902146684600F0CF -:108C20006EFF00273D46B24696F801800CE02846CC -:108C300000F0F3FE064681788088F9F76EF97178C6 -:108C40006D1C00FB0177EDB24545F0D10098C01CCA -:108C500020F00300009004B100203946F9F768F9CC -:108C600000990027084400903D469AF801800CE0E6 -:108C7000284600F0D2FE0646C1788088FEF773FCD5 -:108C800071786D1C00FB0177EDB24545F0D100987D -:108C9000C01C20F00300009004B100203946FEF70C -:108CA0006BFC00994FF000080844009045469AF884 -:108CB00001700EE0284600F0B0FE0646807B30B121 -:108CC00006F1080001F0F9FE727800FB02886D1CC5 -:108CD000EDB2BD42EED10098C01C20F00300009020 -:108CE00004B10020414601F0ECFE00990844C01D8B -:108CF00020F007000090E4BBA24AA1491160111DB9 -:108D0000401E086001222C219F4807F062FCFAF700 -:108D10002EF99E484178806805F09CFB42208DF832 -:108D200004009A480C30C0788DF8060010B1012874 -:108D300004D005E001208DF8060001E08DF806B0B2 -:108D400001A806F0C5FE10B10EA805F042FC0021F6 -:108D50001E22084603F03CF8FBF778F987480CAA76 -:108D600000210C30F8F706FB00B1FFDF9AF819007C -:108D700000E015E0FEF769FF00B1FFDF7F484FF428 -:108D8000F671443018F051FF7C480421443080F8DB -:108D9000E91180F8EA11062180F8EB110321017135 -:108DA000009919B0A1EB0900BDE8F08F70B5734CC4 -:108DB00006464434207804EB4015E078083590B935 -:108DC000A01990F8E80100280ED0A0780F2800D351 -:108DD000FFDF2021284618F028FF687866F302009C -:108DE00068700120E070284670BD2DE9F04105460D -:108DF0000C4600270078052190463E46B1EB101F37 -:108E000000D0FFDF287A58B101280FD0FFDF00BF64 -:108E1000A8F800600CB1278066800020BDE8F081D2 -:108E20000127092674B16888A08008E0022714266B -:108E300044B16888A0802869E060A88A2082287BE5 -:108E40002072E5E7A8F80060E7E710B54F4C6068CE -:108E5000C11D21F00701814200D0FFDF47480121F9 -:108E60000022017042700172032343728172027307 -:108E7000052282821F22C282417345A202610A2218 -:108E8000027641764FF4B061C1616168416010BD06 -:108E900030B53E4C1568636810339D4202D2042001 -:108EA000136030BD354B5D785A6802EB05121070C7 -:108EB00051700320D080172090800120D0709070D6 -:108EC000002090735878401C5870606810306060C3 -:108ED000002030BD70B5064628480024457807E0DC -:108EE000204600F09AFD0178B14204D0641CE4B23F -:108EF000AC42F5D1002070BDF7B5064608780C46A7 -:108F000008B3FFF7E7FF0546202E08D0232E17D021 -:108F1000212E41D0222E3FD0242E2BD114E000F060 -:108F200087FD0DB1697800E00021401A81B2A07878 -:108F30000144FF291ED830B1A08802282CD219E0A4 -:108F40006088172828D215E0227A2AB36188172969 -:108F500010D3A08817280DD3A3795BB1E3794BB167 -:108F6000402A07D84FF6FB72914201D8904213D99C -:108F70000420FEBD0720FEBD342002003004002086 -:108F80000000002000060240600600201C000020B7 -:108F90006E5246357800000065B9207802AA01219A -:108FA000FFF776FF0028E6D12078FFF793FF050052 -:108FB00000D1FFDF203E052E18D2DFE806F0030BBC -:108FC0000E081100A0786870A088E8800FE0608823 -:108FD000A8800CE0A078A87009E0A078E87006E00E -:108FE00054F8020FA8606068E86000E0FFDF00202E -:108FF000C1E700B597B053218DF8001000780BA998 -:1090000000F001008DF80200684605F023F817B063 -:1090100000BD00B5017897B001F001018DF8021094 -:10902000417801F001018DF803100178C1F340018E -:109030008DF804104178C1F340018DF805100178D6 -:1090400089088DF80610417889088DF80710817815 -:109050008DF80810C1788DF8091000798DF80A0094 -:109060004D208DF800000BA9684604F0F3FFCEE711 -:109070002DE9F04FDFF8F883FE4C97B000271BE096 -:10908000012000F07FFD0120FFF790FE0546FA4821 -:1090900007F0C8FA686000B9FFDF686805F027F8D4 -:1090A000A0B12846FAF7CEFA284600F071FD18B9AB -:1090B000F148696807F0BFFA94F9E9010428DFDA9A -:1090C000022007F075FC06460025AAE0EA48696818 -:1090D00007F0B1FAF4E7B8F802104046491C89B22B -:1090E000A8F80210B14201D3002141800221B8F852 -:1090F000020007F0B3FC00286BD0B8F8020054213E -:109100008DF80010ADF802000BA9684604F0A2FF2C -:1091100000B1FFDF9DF8300010F0010F0FD0B8F85C -:10912000020007F0B7FD5FEA000900D1FFDF484603 -:1091300006F0A3FF18B1B8F8020002F065F9B8F81C -:10914000020007F095FD5FEA000900D1FFDF484605 -:1091500006F08CFFE8BB0321B8F8020007F07EFCA4 -:109160005FEA000B48D1FFDF46E000BFDBF81000EC -:1091700010B10078FF2849D0022000F003FD022042 -:10918000FFF714FE8246484607F0A2F8CAF804002A -:1091900000B9FFDFDAF8040007F07CF90021009045 -:1091A0000170B8F802105046AAF8021001F032FE21 -:1091B000484607F071F900B9FFDF504600F0E8FCBF -:1091C00018B99AF80100000704D50098CBF81000F0 -:1091D00012E024E0DBF8100038B10178491C11F0EE -:1091E000FF01017008D1FFDF06E00022114648466A -:1091F00000F011FC00B9FFDF94F9EA01022805DB59 -:10920000B8F8020001F0CAFD0028AFD194F9E901D5 -:10921000042804DB484607F0B5F900B101276D1CAE -:10922000EDB2B54204D294F9EA010228BFF653AF79 -:10923000002F7FF423AF17B00320BDE8F04F00F0FC -:10924000A1BC10B58A4CA0600868E060AFF2DF10E6 -:1092500002F031FD607010BD864800214438017075 -:109260008348017085494160704730B505464FF02D -:1092700080500C46D0F8A41097B0491C05D1D0F806 -:10928000A810C9430904090C08D050F8A01F01F028 -:10929000010129704168216080680EE02B208DF863 -:1092A00000000BA9684604F0D5FE00B1FFDF0120E5 -:1092B00028700C982060BDF83400A0802878002821 -:1092C00003D0607940F0C000607117B030BDF0B5D8 -:1092D0004FF080540746D4F8800097B00D462B26F7 -:1092E000401C0BD1D4F88400401C07D1D4F888006E -:1092F000401C03D1D4F88C00401C0BD0D4F8800063 -:109300003860D4F884007860D4F88800B860D4F865 -:109310008C0016E08DF82C6069460BA804F09AFECC -:1093200000B1FFDF01983860029878608DF82C60FA -:1093300069460BA804F08EFE00B1FFDF0198B8600B -:109340000298F860D4F89000401C0BD1D4F8940037 -:10935000401C07D1D4F89800401C03D1D4F89C00DD -:10936000401C08D054F8900F286060686860A068BE -:10937000A860E06816E08DF800600BA9684604F06C -:1093800069FE00B1FFDF0C9828600D9868608DF8C9 -:1093900000600BA9684604F05DFE00B1FFDF0C9889 -:1093A000A8600D98E86017B0F0BD32480079FDE480 -:1093B00070B5304CE07830B3207804EB4010407A40 -:1093C00000F00700204490F9E801002800DCFFDFEE -:1093D0002078002504EB4010407A00F007000119C6 -:1093E00091F8E801401E81F8E8012078401CC0B2E5 -:1093F00020700F2800D12570A078401CA0700AF0C2 -:109400001BFBE57070BDFFDF70BD3EB50546032157 -:1094100007F024FB0446284607F02AFC054604B959 -:10942000FFDF206918B10078FF2800D1FFDF01AA13 -:109430006946284600F0EFFA60B9FFDF0AE0002233 -:1094400002A9284600F0E7FA00B9FFDF9DF80800FE -:1094500000B1FFDF9DF80000411E8DF80010EED234 -:1094600020690199884201D1002020613EBD0000A1 -:109470001C000020740400206006002068130020F7 -:1094800070B50546A0F57F400C46FF3800D1FFDFE0 -:10949000012C01D0FFDF70BDFFF787FF040000D172 -:1094A000FFDF207820F00F00401D20F0F00050304A -:1094B000207065800020207201202073BDE870407C -:1094C00076E72DE9F04116460D460746FFF76DFF9A -:1094D000040000D1FFDF207820F00F00401D20F0B5 -:1094E000F0005030207067800120207228682061D1 -:1094F000A888A0822673BDE8F04159E730B599B03D -:10950000FFF7E8FC040000D1FFDF0CA92046FFF7BD -:109510000FFB05460BA92046FFF721FB0146522011 -:109520008DF80000BDF830008DF80250001DADF838 -:109530000400BDF82C008DF80310001DADF80600E6 -:10954000E088ADF808000DA9684604F083FD002806 -:1095500000D0FFDF19B030BD2DE9F047DFF80094EF -:109560000546002799F8000010B10820BDE8F087F3 -:1095700028460AF09BFE08B11020F7E7F94C207846 -:1095800008B9FFF762FC607A217A0844C6B200F09D -:109590004FFAB04207D2301AC1B22A460020FFF774 -:1095A00077FC0700E2D1D9F804004E46C01C20F039 -:1095B0000300C9F8040000F05EFB716800EB0108CD -:1095C00001214046FFF7E3FA0646296840448842F5 -:1095D00002D8B6F5803F15D328600020FFF77AFC4B -:1095E00005000DD005F11300D9F8041020F0030098 -:1095F0004E46884200D0FFDF6078401E6070756084 -:109600000420B3E700214046FFF7C1FA0446A64212 -:1096100000D0FFDF04EB0801C9F8041029604FF601 -:10962000FF71A9F80210012189F8001038469DE762 -:109630002DE9F0410446CA4817460D46007810B19E -:109640000820BDE8F08108460AF00AFE08B11020A3 -:10965000F7E7C44E307808B9FFF7F7FB601E1E2805 -:1096600007D8012C3FD12878FE283CD8307600203E -:10967000E7E7A4F120001F2805D8E0B23A462946C2 -:10968000BDE8F04138E4A4F140004FF000081F2885 -:1096900021D8402C02D0412C25D117E068782978B8 -:1096A0004418A97881421ED8FF2C08D808F0BEFFC4 -:1096B00007460AF07BF9381A801EA04201DA122010 -:1096C000BFE728883081A878B07224E02846BDE83A -:1096D000F04100F085BAA4F1A0001F2803D8A02C07 -:1096E00003D0A12C06D00720ABE7287800F00100BA -:1096F000707610E029680920F829A2D38A07A0D142 -:10970000727B02F00302012A04D1F28AD73293B2AB -:109710008B4296D8F161404693E72DE9F0478146A8 -:109720000E4608460AF0C2FD48B948460AF0DCFD7C -:1097300028B909F1030020F00301494501D01020A8 -:1097400014E788484FF0000A4430817869B14178C5 -:10975000804600EB41140834378832460021204609 -:1097600000F024FA050004D027E0A6F800A00520A8 -:10977000FCE6B9F1000F24D03088B84201D90C259D -:109780001FE0607800F00705284600F0FBF908EBC1 -:109790000507324697F8E8014946401C87F8E8017A -:1097A000204607F5F47700F001FA05463878401EA8 -:1097B0003870032000F0E6F92DB10C2D01D0A6F889 -:1097C00000A02846D2E66078654F00F00701012925 -:1097D00023D002290CD0032932D0FFDF98F80110E2 -:1097E0004046491CC9B288F801100F2933D034E033 -:1097F000616821B1000702D46088FFF706FE98F87F -:10980000EA014646012802D1787802F073FA96F907 -:10981000EA010428E2DBFFDFE0E7616811B15248AA -:1098200006F009FF98F8E9014646032802D1787846 -:1098300002F060FA96F9E9010428CFDBFFDFCDE7FB -:10984000C00602D56088FFF7E0FD98F9EB01062815 -:10985000C4DBFFDFC2E780F801A08178491E817078 -:10986000617801F0070101EB080090F8E811491C4C -:1098700080F8E811A5E770B50D4604460AF0F0FC43 -:1098800018B928460AF012FD08B1102070BD29460B -:109890002046BDE8704008F01CBD70B50446154672 -:1098A0000E4608460AF0DCFC18B928460AF0FEFC11 -:1098B00008B1102070BD022C03D0102C01D009205B -:1098C00070BD2A463146204608F026FD0028F7D014 -:1098D000052070BD70B514460D4606460AF0C0FC62 -:1098E00038B928460AF0E2FC18B920460AF0FCFC18 -:1098F00008B1102070BD22462946304608F02BFDE5 -:109900000028F7D0072070BD10B596B004460AF0C5 -:10991000CDFC10B1102016B010BD0F208DF8000046 -:109920000BA9684604F096FB0028F4D19DF834009A -:109930002070BDF836006080BDF83800A08000209F -:10994000E9E770B505460C4608460AF0CDFC20B99B -:1099500074B120680AF0AAFC40B1102070BD00006C -:109960001C0000203004002060060020A08828B1E0 -:1099700021462846BDE87040FDF774BE0920EDE79A -:1099800070B504460D4608460AF06AFC30B9601E00 -:109990001E2814D828460AF063FC08B11020DDE721 -:1099A000022C01D90720D9E704B9FFDFE64800EB14 -:1099B000840050F8041C2846BDE870400847A4F114 -:1099C00020001F28EED829462046BDE87040FAF74F -:1099D0007FBA70B504460D4608460AF067FC30B9F8 -:1099E000601E1E280DD828460AF03AFC08B1102047 -:1099F000B4E7012C01D0022C01D10620AEE70720EC -:109A0000ACE7A4F120001F28F9D829462046BDE87C -:109A10007040FAF7E1BA06F0E4BA30B5CB4D04462F -:109A20006878A04200D8FFDF686800EB041030BD02 -:109A300070B5C64800252C46467807E02046FFF75B -:109A4000ECFF4078641C2844C5B2E4B2B442F5D1BE -:109A5000284683E72DE9F0410C46064600F043F91D -:109A600007463068C01C20F0030232601CBBB748B8 -:109A70003B46092120300AF0CDFA002408E0092CE9 -:109A800011D2DFE804F005070509090B05050700F9 -:109A9000AF4804E0AF4802E0AF4800E0AF480AF04A -:109AA000D9FA054600E0FFDFA54200D0FFDF641CC5 -:109AB000E4B2092CE3D3306800EB07103060C0E556 -:109AC000021D5143452900D245210844C01CB0FB6A -:109AD000F2F0C0B2704700B597B055228DF8002063 -:109AE000001DADF80200ADF804100BA9684604F0A3 -:109AF000B1FA00B1FFDFBDF8300017B000BD2DE9AD -:109B0000FC5F064691484FF000088B4647464446A6 -:109B100090F8019022E02046FFF77FFF050000D17A -:109B2000FFDF687869463844C7B22846FFF700F877 -:109B3000824601A92846FFF712F80346BDF8040043 -:109B40005246001D81B2BDF80000001D80B206F033 -:109B5000DBFF6A78641C00FB0288E4B24C45DAD172 -:109B60003068C01C20F003003060BBF1000F00D053 -:109B700000204246394606F0D5FF3168084430607F -:109B8000BDE8FC9F7149443108710020C8707047DE -:109B90006E494431CA782AB10A7801EB4211083182 -:109BA000814201D001207047002070472DE9F0412B -:109BB00006460078154600F00F0400201080601E55 -:109BC0000F46052800D3FFDF5F482A46103000EB20 -:109BD0008400394650F8043C3046BDE8F04118474F -:109BE00038B50446407800F00300012803D002286D -:109BF0000BD0072038BD606858B10AF07EFBD0B9A1 -:109C000060680AF071FB20B915E060680AF028FB73 -:109C100088B969462046FCF7A9F90028EAD160789E -:109C200000F00300022808D19DF8000028B1606808 -:109C30000AF05AFB08B1102038BD6189F8290DD807 -:109C4000208988420AD8607800F003023F48012A40 -:109C500006D1D731C26989B28A4201D2092038BD02 -:109C600094E80E0000F10C0585E80E000AB9002109 -:109C70008182002038BD2DE9F05F4FF000093348A4 -:109C8000C8464F464E464D46CB464C4690F801A03E -:109C900011E02046FFF7C1FE4178827809F1010901 -:109CA000884412FB0177C27812FB0166807B10FBAF -:109CB0000155641CE4B25445EBD10BEB890000EB79 -:109CC000C80000EB870000EB860000EBC5011F48D1 -:109CD000027A01EBC201427A807A01EBC20101EB08 -:109CE000C000BDE8F09F2DE9F047DFF86090002547 -:109CF0002C4699F8092099F8081099F801700A443F -:109D0000D6B299F80A20114401F0FF0808E0204675 -:109D1000FFF783FE817B407811FB0055641CE4B2A1 -:109D2000BC42F4D199F80800401C3044304440440F -:109D3000401C0EB1012100E0002108444419FF2C11 -:109D400000D9FFDFE0B211E434200200300400202B -:109D5000633D00008DAB0000592F00003120010051 -:109D60002DE9F041074614468846084601F02EFDCD -:109D7000064608EB88001C22796802EBC0000D182B -:109D8000688C58B14146384601F028FD0146786894 -:109D90000078C200082305F120000CE0E88CA8B18F -:109DA0004146384601F021FD014678680823407895 -:109DB000C20005F1240006F0F4FC38B1062121723E -:109DC0006681D0E90010C4E9031009E02878092869 -:109DD0000BD00520207266816868E0600020287042 -:109DE0002046BDE8F04101F0E7BC07202072668103 -:109DF000F4E72DE9F04116460D460746406801EBB1 -:109E000085011C2202EBC1014418204601F00FFD20 -:109E100040B10021708865F30F2160F31F410820D5 -:109E20000AF0D2F909202070324629463846BDE8AA -:109E3000F04195E72DE9F0410E46074600241C212C -:109E4000F07816E004EB8403726801EBC303D25C84 -:109E50006AB1FFF7AAFA050000D1FFDF6F802A463A -:109E600021463046FFF7C5FF0120BDE8F081641CA4 -:109E7000E4B2A042E6D80020F7E770B50646002419 -:109E80001C21C0780AE000BF04EB8403726801EB78 -:109E9000C303D5182A782AB1641CE4B2A042F3D8CF -:109EA000402070BD2821284617F09DFE70688089EB -:109EB0002881204670BD70B5034600201C25DC7843 -:109EC0000DE000BF00EB80065A6805EBC606324481 -:109ED000167816B1128A8A4204D0401CC0B284425D -:109EE000F0D8402070BDF0B5044600201C26E5786F -:109EF0000EE000BF00EB8007636806EBC7073B443A -:109F00001F788F4202D15B78934204D0401CC0B2CC -:109F10008542EFD84020F0BD0078032801D0002012 -:109F20007047012070470078022801D00020704758 -:109F3000012070470078072801D0002070470120D9 -:109F400070472DE9F041064688461078F1781546AD -:109F5000884200D3FFDF2C781C27641CF078E4B221 -:109F6000A04201D8201AC4B204EB8401706807EB48 -:109F7000C1010844017821B14146884708B12C70DD -:109F800073E72878A042E8D1402028706DE770B5CB -:109F900014460B880122A240134207D113430B80C1 -:109FA00001230A22011D06F0C6FB047070BD2DE9D5 -:109FB000FF4F81B00878DDE90E7B9A4691460E4648 -:109FC00040072CD4019806F065FE040000D1FFDFA5 -:109FD00007F1040820461FFA88F105F0A9FE0500E4 -:109FE00000D1FFDF204629466A4606F092F9009824 -:109FF000A0F80370A0F805A0284606F04BFA0178F7 -:10A0000069F306016BF3C711017020461FFA88F14E -:10A0100005F0DEFE00B9FFDF019804F07CF906EBE5 -:10A020000900017F491C017705B0BDE8F08F2DE9DB -:10A03000F84F0E469A4691460746032106F00EFD5C -:10A040000446008DDFF8B085002518B198F80000AF -:10A05000B0421ED1384606F01DFE070000D1FFDFDA -:10A0600009F10401384689B205F062FE050010D0FE -:10A07000384629466A4606F04CF9009800210A46FF -:10A080000180817004F00AFA0098C01DCAF800002F -:10A0900021E098F80000B04216D104F1260734F808 -:10A0A000341F012000FA06F911EA090F00D0FFDF82 -:10A0B0002088012340EA090020800A22391D384601 -:10A0C00006F054FB067006E0324604F1340104F158 -:10A0D0002600FFF75CFF0A2188F800102846BDE83B -:10A0E000F88FFEB514460D46064602AB0C2206213B -:10A0F000FFF79DFF002826D00299687812220A7087 -:10A10000801C487008224A80A87020888880608857 -:10A11000C880A0880881E088488100240C20CDE90F -:10A1200000040523062229463046FFF740FF21465A -:10A1300066F31F41F0230022012009F09BFF68789D -:10A14000801C68700120FEBDFEB514460D46062237 -:10A15000064602AB1146FFF76AFF002812D0029BA9 -:10A16000132000211870A8785870022058809C8015 -:10A170000620CDE900010246052329463046FFF7B7 -:10A1800016FF0120FEBD2DE9FE430C46804644E04B -:10A1900002AB0E2207214046FFF749FF002841D0BD -:10A1A00060681C2267788678BF1C06EB860102EB8C -:10A1B000C101451802981421017047700A2141809D -:10A1C000698A0181E98A4181A9888180A98981817F -:10A1D000304601F0FBFA029905230722C8806F7010 -:10A1E0000420287000250E20CDE9000521464046B8 -:10A1F000FFF7DDFE294666F30F2168F31F41F023C8 -:10A200000022082009F036FF6078FC49801C60704D -:10A2100062682046921CFFF794FE606880784028B0 -:10A22000B6D10120BDE8FE83FEB50D46064638E0F6 -:10A2300002AB0E2207213046FFF7F9FE002835D089 -:10A2400068681C23C17801EB810203EBC202841809 -:10A25000029815220270627842700A224280A28916 -:10A260004281A2888281084601F0B0FA0146029834 -:10A270008180618AC180E18A0181A088B8B1002013 -:10A28000207000210E20CDE9000105230722294678 -:10A290003046FFF78CFE6A68D9492846D21CFFF782 -:10A2A00050FE6868C0784028C2D10120FEBD06205B -:10A2B000E6E72DE9FE430C46814644E0204601F0E6 -:10A2C000A0FAD0B302AB082207214846FFF7AFFE41 -:10A2D0000028A7D060681C2265780679AD1C06EBC3 -:10A2E000860102EBC10147180298B7F810800621D9 -:10A2F0000170457004214180304601F067FA014643 -:10A30000029805230722C180A0F804807D700820F0 -:10A3100038700025CDE9000521464846FFF747FE85 -:10A32000294666F30F2169F31F41F023002208201C -:10A3300009F0A0FE6078801C60706268B149204618 -:10A34000121DFFF7FEFD606801794029B6D101209A -:10A3500068E72DE9F34F83B00E4680E0304601F008 -:10A3600050FA002875D071681C2091F8068008EB1F -:10A37000880200EBC2000C184146304601F035FA65 -:10A380000146A078C30070684078C20004F1240040 -:10A3900006F023FA07468088E18B401A80B2002538 -:10A3A00081B3AA46218B814200D8084681460246E5 -:10A3B00002AB07210398FFF73AFE010028D0BAF15B -:10A3C000000F03D0029AB888022510808B46E28BDA -:10A3D0003968A9EB05001FFA80FA0A440398009235 -:10A3E00006F058FCED1D009A59465346009506F0BC -:10A3F00017F8E08B504480B2E083B988884209D1D5 -:10A40000012508E0FFE7801C4FF0010A80B2C9E790 -:10A41000002009E60025CDE90095238A0722314670 -:10A420000398FFF7C4FDE089401EE0818DB1A0785C -:10A43000401CA0707068F178427811FB02F1CAB23A -:10A44000816901230E3006F076F980F80080002043 -:10A45000E08372686C493046921DFFF772FD7068A8 -:10A46000817940297FF47AAF0120DDE570B5064699 -:10A4700048680D4614468179402910D104EB8401C7 -:10A480001C2202EBC101084401F0F2F9002806D0B9 -:10A490006868294684713046BDE8704059E770BD50 -:10A4A000FEB50C460746002645E0204601F0A9F916 -:10A4B000D8B360681C22417901EB810102EBC10134 -:10A4C0004518688900B9FFDF02AB0822072138462A -:10A4D000FFF7ADFD002833D00299607816220A708C -:10A4E000801C4870042048806068407901F06EF953 -:10A4F000014602980523072281806989C1800820CE -:10A50000CDE9000621463846FFF751FD6078801CF2 -:10A510006070A88969890844B0F5803F00D3FFDFE7 -:10A52000A88969890844A8816E81626837492046F4 -:10A53000521DFFF706FD606841794029B5D1012021 -:10A54000FEBD30B5438C458BC3F3C704002345B132 -:10A55000838B641EED1AC38A6D1E1D4495FBF3F3B5 -:10A56000E4B22CB1008918B1A04200D820460344BF -:10A570004FF6FF70834200D3034613800C7030BD4A -:10A580002DE9FC41074616460D46486802EB860158 -:10A590001C2202EBC101441801AA69462046FFF7BC -:10A5A000D0FFA1896389BDF80420C81880B2824217 -:10A5B0001FD001280AD99DF800C0BCF1000F03D0BC -:10A5C000B4F808C0844501D8002B12D0501A00D529 -:10A5D000002060816868407940280AD1204601F057 -:10A5E0003DF9002805D06868294646713846FFF7CE -:10A5F00057FFBDE8FC8100002C000020199F0000DF -:10A60000279F0000359F000071B800005DB8000072 -:10A610002DE9FE4F8946804615465088032106F0F5 -:10A620001DFA8346B8F80200402801D2402000E01D -:10A63000403880B282460146584601F0E2F80028D0 -:10A640007ED00AEB8A001C22DBF8041002EBC0006B -:10A650000C18204601F0EBF8002877D1B8F800007C -:10A66000E18A88423CD8A189D1B348456ED1002601 -:10A670005146584601F0B2F8218C0F18608B48B94A -:10A68000B9F1020F62D3B8F804006083618A88428E -:10A6900026D80226A9EB06001FFA80F9B888A28BFB -:10A6A000801A002814DD4946814500DA084683B245 -:10A6B00068886968029139680A44CDE9003206F079 -:10A6C000D7FADDE90121F61D009B009605F06FFE2B -:10A6D000A18B01EB090080B2A083618B884207D96E -:10A6E000688803B052465946BDE8F04F01F0DDB826 -:10A6F0001FD14FF009002872B8F802006881D7E92D -:10A700000001C5E90401608BA881284601F054F8D6 -:10A710005146584601F062F80146DBF80400082370 -:10A720000078C20004F1200006F03BF80020A0836E -:10A730006083A0890AF0FF02401EA081688800E0C3 -:10A7400004E003B05946BDE8F04F19E7BDE8FE8FBD -:10A750002DE9F041064615460F461C46184609F0FD -:10A760007FFD18B9206809F0A1FD08B1102007E4A9 -:10A770007168688C0978B0EBC10F01D3132005E430 -:10A780003946304601F02AF80146706808230078FF -:10A79000C20005F1200005F0CEFFD4E90012C0E9A7 -:10A7A00000120020E3E710B50446032106F056F935 -:10A7B0000146007800F00300012804D08A8A204670 -:10A7C000BDE81040C0E42046BDE8104001F114028D -:10A7D00087E470B50446032106F040F905460146BA -:10A7E0002046FFF766FD002816D029462046FFF7D1 -:10A7F00057FE002810D029462046FFF715FD0028F7 -:10A800000AD029462046FFF7BEFC002804D029467E -:10A810002046BDE870409CE570BD2DE9F0410C4636 -:10A8200080461EE0E178427811FB02F1CAB28169EC -:10A8300001230E3005F0B5FF077860681C22C1794E -:10A84000491EC17107EB8701606802EBC101461820 -:10A850003946204600F0D5FF18B1304600F0E0FF41 -:10A8600020B16068C1790029DCD180E7FEF79DFD49 -:10A87000050000D1FFDF0A202872384600F0A6FF4D -:10A8800068813946204600F0B0FF01466068082321 -:10A890004078C20006F1240005F083FFD0E90010E3 -:10A8A000C5E90310A5F80280284600F085FFB078BE -:10A8B00000B9FFDFB078401EB07058E770B50C46A5 -:10A8C0000546032106F0CAF801464068C2792244D1 -:10A8D000C2712846BDE870409FE72DE9FE4F8246D1 -:10A8E000507814460F464FF0000800284FD001283A -:10A8F00007D0022822D0FFDF2068B8606068F860C7 -:10A9000024E702AB0E2208215046FFF790FB0028F7 -:10A91000F2D00298152105230170217841700A2197 -:10A920004180C0F80480C0F80880A0F80C806288DC -:10A9300082810E20CDE90008082221E0A678304669 -:10A9400000F044FF054606EB86012C22786802EBF6 -:10A95000C1010822465A02AB11465046FFF767FB79 -:10A960000028C9D002980721017021784170042184 -:10A97000418008218580C680CDE9001805230A465C -:10A9800039465046FFF713FB87F80880DEE6A678C5 -:10A99000022516B1022E13D0FFDF2A1D914602AB0D -:10A9A00008215046FFF743FB0028A5D0029801215B -:10A9B000022E0170217841704580868002D005E02A -:10A9C0000625EAE7A188C180E1880181CDE90098E8 -:10A9D0000523082239465046D4E710B50446032122 -:10A9E00006F03CF8014600F108022046BDE81040A0 -:10A9F00073E72DE9F05F0C4601281DD0957992F898 -:10AA00000480567905EB85011F2202EBC10121F07C -:10AA1000030B08EB060111FB05F14FF6FF7202EA8A -:10AA2000C10909F1030115FB0611F94F21F0031AC1 -:10AA300040B101283DD124E06168E57891F80080BB -:10AA40004E78DFE75946786805F029FE606000B966 -:10AA5000FFDF5946606817F0E8F8E57051467868FE -:10AA600005F01DFE6168486100B9FFDF606842695A -:10AA700002EB09018161606880F8008060684670BF -:10AA800017E0606852464169786805F033FE5A461F -:10AA90006168786805F02EFE032005F089FF044602 -:10AAA000032005F08DFF201A012802D1786805F0F7 -:10AAB000EBFD0BEB0A00BDE8F09F024600210220EF -:10AAC00097E713B5009858B10024684605F0C9FD12 -:10AAD000CF490A22002C0A7001D1009A4A601CBD9D -:10AAE00001240020F2E770B50C46154638212046B7 -:10AAF00017F09BF8012666700A2104F11C0017F07C -:10AB000094F805B9FFDF297A207861F301002070FD -:10AB1000A879002817D02A4621460020FFF769FFB0 -:10AB20006168402088706168C870616808716168F8 -:10AB300048716168887161682888088161686888DF -:10AB400048816068868170BDC878002802D00022E4 -:10AB500001204EE7704770B50546002165F31F419F -:10AB6000012009F031FB0321284605F077FF04009E -:10AB700000D1FFDF21462846FFF75CF9002804D00A -:10AB8000207840F010002070012070BD2DE9FF41B9 -:10AB900080460E460F0CFEF708FC050007D06F80BC -:10ABA0000321384605F05AFF040008D106E004B03E -:10ABB0003846BDE8F0411321F9F72EBEFFDFB8F1AA -:10ABC000010F05D0B8F1080F18D0FFDFBDE8FF81F5 -:10ABD00020782A4620F0080020700020ADF80200FE -:10ABE00002208DF800004FF6FF70ADF80400ADF8BC -:10ABF000060069463846F9F717F9E7E7C6F3072173 -:10AC000001EB81021C23606803EBC202805C042814 -:10AC100003D008280AD0FFDFD8E7012000904FF4C6 -:10AC200040432A46204600F009FECFE704B02A46FA -:10AC30002046BDE8F041FFF7DCB82DE9F05F0027C2 -:10AC4000B0F80A9090460C4605463E46B9F1400FD2 -:10AC500001D2402001E0A9F140001FFA80FA287AD1 -:10AC6000C01E08286BD2DFE800F00D04192058360A -:10AC70003C4772271026002C6CD0D5E90301C4E9AB -:10AC800002015CE070271226002C63D00A2205F135 -:10AC90000C0104F1080016F074FF50E071270C2637 -:10ACA000002C57D0E868A06049E0742710269CB3B8 -:10ACB000D5E90301C4E902016888032105F0CEFE4D -:10ACC0008346FEF772FB024668885080514658461C -:10ACD000FFF746F833E075270A26ECB1A8892081F2 -:10ACE0002DE076271426BCB105F10C0004F1080311 -:10ACF00007C883E8070022E07727102664B1D5E96A -:10AD00000301C4E902016888032105F0A7FE01469A -:10AD10006888FFF782FD12E01CE073270826CCB19B -:10AD20006888032105F09AFE01460078C00606D522 -:10AD30006888FFF77FF810B96888F8F767FCA8F80B -:10AD400000602CB12780A4F8069066806888A080F7 -:10AD50000020B0E6A8F80060FAE72DE9FC410C46B7 -:10AD60001E4617468046032105F078FE05460A2C4C -:10AD70000AD2DFE804F005050505050509090907FC -:10AD8000042303E0062301E0FFDF0023CDE9007682 -:10AD9000224629464046FFF70AF92AE438B5054617 -:10ADA000A0F57F40FF3830D0284605F061FF040051 -:10ADB00000D1FFDF204605F08BFA002815D00146B0 -:10ADC0006A46204605F0A5FA00980321B0F8054030 -:10ADD000284605F043FE0546052C03D0402C05D23D -:10ADE000402404E0007A80B1002038BD403CA4B289 -:10ADF000214600F006FD40B1686804EB84013E2264 -:10AE000002EBC101405A0028EFD0012038BD0000FC -:10AE10002C0000202DE9F04F044689B0408805F051 -:10AE200027FF050000D1FFDF06AA2846616800F071 -:10AE3000C1FC069D001F81B235F8032F6B888A4242 -:10AE400005D1042B0AD0052B1DD0062B15D0224688 -:10AE50002846FFF7DDFB09B0BDE8F08F16462D1D33 -:10AE6000224629463046F7F78CFA0828F3D12246C5 -:10AE700029463046FCF73DFCEDE76088291D6368F4 -:10AE8000FAF7F0FCE7E717466088032105F0E6FDD6 -:10AE90004FF000088DF804800646ADF80680042FB8 -:10AEA000D9D36A79002AD6D028794FF6FF794FF0A6 -:10AEB0001C0A13282CD008DC012878D0062847D09B -:10AEC000072875D0122874D106E0142872D01528EE -:10AED00071D016286DD1ACE10C2F6AD1307800F01A -:10AEE0000301012965D040F0080030706879B07026 -:10AEF00001208DF804002889ADF808006889ADF8B4 -:10AF00000A00A889ADF80C00E889ADF80E0019E038 -:10AF1000B07890429FD1307801079CD5062F9AD106 -:10AF200020F0080030706088414660F31F41012026 -:10AF300009F04AF902208DF80400ADF8089028893C -:10AF4000ADF80A006088224601A9F8F76DFF82E794 -:10AF5000082F80D12F89B5F80A90402F01D24020C8 -:10AF600001E0A7F1400080B280460146304600F083 -:10AF700048FC08B3716808EB88002C2202EBC00083 -:10AF8000095A4945E3D1FE4807AAD0E90210CDE9A4 -:10AF9000071068798DF81C0008F0FF058DF81E5029 -:10AFA00060883146FFF799FC2246294639E0B6E031 -:10AFB00014E03CE039E0E6E0F148D0E90010CDE9EA -:10AFC00007106879ADF820708DF81C00ADF822905C -:10AFD000608807AA3146FFF780FC3CE7082FB6D10E -:10AFE0006889B5F80880402801D2402000E0403848 -:10AFF00087B23946304600F004FC0028A7D007EBA2 -:10B00000870271680AEBC2000844028A42459ED159 -:10B01000017808299BD140786979884297D1F9B2A3 -:10B0200022463046FEF7E5FE15E70E2F07D0CDF895 -:10B030001C80CDF8208068798DF81C00C8E76989EC -:10B04000EF898B46B5F80C903046FEF734FFABF134 -:10B050004001402901D309204AE0B9F1170F01D37B -:10B06000172F01D20B2043E040280ED000EB8002C6 -:10B0700071680AEBC20008440178012903D14078C5 -:10B0800069798842A9D00A2032E03046FEF7F5FE01 -:10B09000014640282BD001EB810372680AEBC30004 -:10B0A00002EB0008012288F800206A7988F8012064 -:10B0B00070682A894089B84200D938462D8A03230E -:10B0C0002372A282E7812082A4F80C906582084650 -:10B0D00000F07CFB6081A8F81490A8F81870A8F81C -:10B0E0000E50A8F810B0204600F066FBB3E604202E -:10B0F00005212172A4F80A80E08101212173A04971 -:10B10000D1E90421CDE9072169798DF81C10ADF84A -:10B110001E00608807AA3146FFF7DFFBE3E7062F32 -:10B12000E4D3B078904215D13078010712D520F0E1 -:10B13000080030706088414660F31F41012009F02B -:10B1400043F802208DF804002889ADF80800ADF816 -:10B150000A90F7E604213046FEF7C5FE0546402872 -:10B16000C4D002208303009022462946304600F0D6 -:10B1700065FB4146608865F30F2160F31F4108209D -:10B1800009F022F867E60E2FB0D104213046FEF711 -:10B19000AAFE81464028A9D04146608869F30F2164 -:10B1A00060F31F41082009F00FF8288A0790E8890A -:10B1B00000907068AF894089B84200D9384683460C -:10B1C000B5F80A8028890590484600F0FFFA6081AA -:10B1D000079840B10220079B00902246494630461E -:10B1E00000F02CFB37E6B8F1170F1ED3172F1CD336 -:10B1F0000420207200986082E781A4F810B0A4F8BF -:10B200000C8009EB890271680AEBC2000D180099E5 -:10B210000598A5F81480A5F818B0E9812882204681 -:10B2200000F0CAFA0620287015E601200B230090D2 -:10B23000D3E7082FA6D129893046FEF73CFE074602 -:10B2400040289FD007EB870271680AEBC2000844D0 -:10B25000804600F0ECFA002894D16D89B8F80E0011 -:10B260002844B0F5803F05D360883A46314600F067 -:10B270001CFBF0E5002D85D0A8F80E0060883A464A -:10B280003146FFF7F3F808202072384600F09EFAA6 -:10B290006081A58127E770B50D460646032105F0BC -:10B2A000DDFB040004D02078000704D5112070BD18 -:10B2B00043F2020070BD2A4621463046FEF711FFD8 -:10B2C00018B9286860616868A061207840F00800BB -:10B2D0002070002070BD70B50D460646032105F0B4 -:10B2E000BDFB040004D02078000704D4082070BD02 -:10B2F00043F2020070BD2A4621463046FEF724FF85 -:10B3000000B9A582207820F008002070002070BDD0 -:10B310002DE9F04F0E4691B08046032105F09EFBCB -:10B320000446404605F0B6FC07460020079008900A -:10B330000990ADF830000A9002900390049004B98F -:10B34000FFDF0DF1080917BBFFDF20E038460BA92E -:10B35000002204F046FE9DF82C0000F07F050A2D27 -:10B3600000D3FFDF6019017F491E01779DF82C0093 -:10B3700000060CD52A460CA907A8FEF708FE01E036 -:10B380005C20020019F80510491C09F80510761E0A -:10B39000F6B2DBD204F13400FC4D04F1260BDFF8E9 -:10B3A000F0A304F12A07069010E05846069900F031 -:10B3B0006EFA064628700A2800D3FFDF5AF82610D6 -:10B3C00040468847E08CC05DB04202D0208D002806 -:10B3D000EBD10A202870EE4D4E4628350EE00CA920 -:10B3E00007A800F054FA0446375D55F8240000B968 -:10B3F000FFDF55F82420394640469047BDF81E002F -:10B400000028ECD111B027E510B5032105F026FB8B -:10B41000040000D1FFDF0A2104F11C0016F005FC36 -:10B42000207840F00400207010BD10B50C460321B8 -:10B4300005F014FB01190A7F01211AB9808EA14081 -:10B44000084000D0012010BD2DE9F84F894615466F -:10B450008246032105F002FB070004D0284608F0CD -:10B46000FFFE40B903E043F20200BDE8F88F484612 -:10B4700008F01CFF08B11020F7E7786828B1698848 -:10B480000089814201D90920EFE7B9F800001C24A6 -:10B4900018B1402809D2402008E03846FEF7EDFCFC -:10B4A0008046402819D11320DFE7403880B280461B -:10B4B0000146384600F0A5F948B108EB88007968E4 -:10B4C00004EBC000085C012803D00820CDE705206C -:10B4D000CBE7FDF76AFF06000BD008EB8800796820 -:10B4E00004EBC0000C18B9F8000020B1E88910B1D5 -:10B4F00013E01120B9E72888172802D36888172895 -:10B5000001D20720B1E7686838B12B1D22464146B9 -:10B510003846FFF71DF90028A7D104F10C0269464F -:10B520002046FFF70EF8288860826888E082B9F824 -:10B53000000030B102202070E889A080E889A0B125 -:10B540002BE003202070A889A080786881784029AA -:10B5500005D180F8028039465046FEF714FE404679 -:10B5600000F034F9A9F8000021E07868218B4089C7 -:10B57000884200D908462083A6F802A00420307231 -:10B58000B9F800007081E0897082F181208B3082EF -:10B59000A08AB081304600F00FF97868C178402960 -:10B5A00005D180F8038039465046FEF73DFE002065 -:10B5B0005BE770B50D460646032105F04FFA04001F -:10B5C00003D0402D04D2402503E043F2020070BDB9 -:10B5D000403DADB2294600F014F958B105EB8501A4 -:10B5E0001C22606802EBC101084400F020F918B188 -:10B5F000082070BD052070BD2A462146304600F067 -:10B6000054F9002070BD2DE9F0410D4616468046E4 -:10B61000032105F023FA0446402D01D2402500E025 -:10B62000403DADB28CB1294600F0EBF880B105EB9E -:10B6300085011C22606802EBC1014718384600F002 -:10B64000F6F838B10820BDE8F08143F20200FAE7CD -:10B650000520F8E733463A4629462046FFF778F8B2 -:10B660000028F0D1EAB221464046FEF789FF0020CB -:10B67000E9E72DE9F0410D4616468046032105F025 -:10B68000EDF90446402D01D2402500E0403DAFB227 -:10B6900024B1304608F0E4FD38B902E043F202007C -:10B6A000D1E7306808F0DCFD08B11020CBE739465F -:10B6B000204600F0A6F860B107EB87011C22606805 -:10B6C00002EBC1014518284600F0B1F818B1082076 -:10B6D000B9E70520B7E7B088A98A884201D90C20CC -:10B6E000B1E76168E88C4978B0EBC10F01D3132052 -:10B6F000A9E73946204600F078F80146606808233B -:10B700004078C20005F1240005F015F8D6E90012D2 -:10B71000C0E90012FAB221464046FEF7A7FE00201B -:10B7200091E72DE9F0470D461F46904681460321DB -:10B7300005F094F90446402D01D2402001E0A5F126 -:10B74000400086B23CB14DB1384608F0CDFD50B155 -:10B750001020BDE8F08743F20200FAE76068C8B144 -:10B76000A0F80C8024E03146204600F04AF888B169 -:10B7700006EB86011C22606802EBC10145182846D1 -:10B7800000F055F840B10820E3E700002C0000204D -:10B79000742002000520DCE7A5F80880F2B22146FB -:10B7A0004846FEF7EDFE1FB1A88969890844388034 -:10B7B0000020CEE704F0ADBD017821F00F01491C57 -:10B7C00021F0F00110310170FDF7F2BD10B5044613 -:10B7D000402800D9FFDF4034A0B210BD4068426964 -:10B7E0000078484302EBC0007047C2784068037895 -:10B7F00012FB03F24378406901FB032100EBC10017 -:10B800007047C2788A4209D9406801EB81011C2245 -:10B8100002EBC101405C08B1012070470020704775 -:10B820000078062801D90120704700207047007871 -:10B83000062801D00120704700207047F0B401EBCA -:10B8400081061C27446807EBC6063444049D052680 -:10B850002670E3802571F0BCFEF782BA10B54189ED -:10B8600011B1FFF7DDFF08B1002010BD012010BDB0 -:10B8700010B5C18C8278B1EBC20F04D9C18911B166 -:10B88000FFF7CEFF08B1002010BD012010BD10B59C -:10B890000C4601230A22011D04F083FF0078218851 -:10B8A000012282409143218010BDF0B402EB820559 -:10B8B0001C264C6806EBC505072363554B681C79AD -:10B8C000402C03D11A71F0BCFEF7F3BCF0BC7047FA -:10B8D00010B5EFF3108000F0010472B6E94841782A -:10B8E000491C41704078012801D1F7F74BFB002C2F -:10B8F00000D162B610BD70B5E24CE07848B90125C0 -:10B90000E570FFF7E5FFF7F745FB20B1002008F0F1 -:10B910009AF8002070BD4FF080406571C0F8045364 -:10B92000F7E770B5EFF3108000F0010572B6D54C63 -:10B93000607800B9FFDF6078401E6070607808B9F9 -:10B94000F7F724FB002D00D162B670BDCD4810B5CD -:10B95000C17821B100214171C170FFF7E2FF0020E1 -:10B9600010BD10B50446F7F715FBC649C978084065 -:10B9700000D001202060002010BD2DE9F05FDFF82D -:10B9800004934278817889F80620002689F8071008 -:10B99000074689F808600078354620B101280FD0A5 -:10B9A00002280FD0FFDFF7F702FB98B1F7F706FB8D -:10B9B000B0420FD13046F7F705FB0028FAD047E038 -:10B9C0000126F0E7FFF784FFF7F7E4FA0028FBD041 -:10B9D0000226E8E701208407E060C4F80451AA4980 -:10B9E0000E600107D1F84412A74AC1F34231243254 -:10B9F0001160A549343108604FF0020BC4F804B35C -:10BA0000A060DFF888A2DAF80010C94341F3001102 -:10BA100001F10108DAF8001041F01001CAF8001035 -:10BA200000E020BFD4F804010028FAD03046F7F730 -:10BA3000C9FA0028FAD0B8F1000F05D1DAF80010E1 -:10BA400021F01001CAF80010C4F808B3C4F804517A -:10BA500099F807004C4670B1387860B9F7F79AFA50 -:10BA6000074608F09FF96FF0004117B1C4E90310D1 -:10BA700001E0C4E9030116B12571BDE8F09F01277B -:10BA8000BE0727714FF01908C6F80883B761C6F8DA -:10BA90000051C6F80C51C6F81051F7F77BFA10B1F7 -:10BAA000A770376100E02770FFF712FF7649A07991 -:10BAB00020310860C6F80483DFE770B5050000D1C7 -:10BAC000FFDF4FF080424FF0FF30C2F80803002143 -:10BAD000C2F80011C2F80411C2F80C11C2F810111A -:10BAE000684C6170F7F75CFA10B10120E07060708B -:10BAF0002846BDE8704040E72DE9F05F6448D0F883 -:10BB000000B0634A6349083211608406D4F8080122 -:10BB100010B14FF0010801E04FF00008D4F8000127 -:10BB200000B101208146D4F8040108B1012600E0EB -:10BB30000026D4F80C0100B101208246D4F810018F -:10BB400008B1012700E0002748EA090126EA0100C0 -:10BB500020EA0A00B84300D0FFDF0025B8F1000F4B -:10BB600004D0C4F80851012007F06DFF5FEA090016 -:10BB7000DFF810814FF0010913D0C4F8005198F894 -:10BB8000050020B188F80550002007F05CFF98F808 -:10BB9000000030B1F7F7FEF918B188F80290C4F848 -:10BBA00010900EB1C4F80451BAF1000F0CD0C4F8D3 -:10BBB0000C5198F80200464600B9FFDFB5703570A9 -:10BBC000C4F81490FFF7ADFE37B1C4F8105198F8DF -:10BBD000040008B100F020F82D49091DC1F800B09B -:10BBE0004BE770B5274DE87808B9F7F7CFF9012092 -:10BBF0008407A061A87850B1D4F80C0120B90020C6 -:10BC0000F7F7E0F90028F7D10020C4F80C014FF055 -:10BC1000FF30C4F8080370BD2DE9F041194C4FF016 -:10BC200080470125E079F0B1012803D0217A401E38 -:10BC3000814218DAF7F7AEF9064608F0B3F8E17971 -:10BC4000012902D9217A491C21720EB1216900E033 -:10BC5000E168411A022902DA11F1020F0BDC0EB180 -:10BC6000206100E0E060FFF733FEF7F793F928B1B9 -:10BC70003D61A57003E07D61BDE8F0812570002085 -:10BC80002072F9E7380000201805004010ED00E0B0 -:10BC900010050240010000014FF0E0214FF000705C -:10BCA000C1F88001C1F88002384B802283F800245B -:10BCB000C1F80001704700B502460420344903E092 -:10BCC00001EBC0031B792BB1401EC0B2F8D2FFDFDD -:10BCD000FF2000BD41F8302001EBC00100224A7175 -:10BCE0008A7101220A7100BD294A002102EBC000BD -:10BCF0000171704710B50446042800D3FFDF2448C3 -:10BD000000EBC4042079012800D0FFDF6079A1791D -:10BD1000401CC0B2814200D060714FF0E0214FF072 -:10BD20000070C1F8000210BD2DE9F0411948056806 -:10BD300018491948083108601448042690F800048E -:10BD4000134F4009154C042818D0FFDF16E0217866 -:10BD500007EBC1000279012A08D1427983799A421E -:10BD600004D04279827157F8310080472078401C16 -:10BD7000C0B22070042801D300202070761EF6B2D5 -:10BD8000E5D20448001D0560BDE8F08119E000E03F -:10BD90009006002010050240010000014C00002028 -:10BDA000F8B51D46DDE906470E000AD004F072FF23 -:10BDB0002346FF1DBCB231462A46009404F030FBF6 -:10BDC000F8BDD0192246194615F096FE2046F8BD5A -:10BDD000F84B586019721A80C90015F026BF70B56B -:10BDE0000D460446102115F0FEFE258117206081C6 -:10BDF000A07B40F00A00A07370BD4FF6FF720A806E -:10BE00000146032008F0E0B9704700897047827B43 -:10BE1000D30701D1920703D480890880002070479E -:10BE200005207047827B920700D5818170470146CB -:10BE30000020098847F2FE12114200D00120DD499E -:10BE4000497A002901D040F00800704700B5034648 -:10BE5000807BC00701D0052000BD59811846FFF73F -:10BE6000E6FFC00703D0987B40F004009873987BEE -:10BE700040F001009873002000BD827B520700D57E -:10BE800009B14089704717207047827B61F3C30274 -:10BE9000827370472DE9F04F0E46017804464FF04B -:10BEA000010B0BFA01F047F2FF1100EA010961688A -:10BEB0004FF6FF7887B008881D469646404506D065 -:10BEC000B9F1000F07D047F2FE12104203D0012053 -:10BED00007B0BDE8F08F40EA090008804FF0000A83 -:10BEE00095B185F800A022780027052003210223C0 -:10BEF000102A6FD2DFE802F06E0D2C35546F768079 -:10BF000054CBC79CCFFEFDFC20780B28EBD004203F -:10BF1000DEE762682089937B9B077DD5172851D384 -:10BF200013898342FBD39289172A01D3824249D1D4 -:10BF30002A7822F03F02921C2A70A5F80100318075 -:10BF4000616888816068817B21F00201817342E130 -:10BF5000042129702189A5F801106189A5F8031031 -:10BF60008FE0208A3188C01D1FFA80F84145D6D362 -:10BF7000062028702089A5F801006089A5F8030033 -:10BF8000A089A5F805000721208ACDE90001608875 -:10BF90002A4671466369FFF703FFA6F800801AE19D -:10BFA000082A10D0082129702189A5F8011061897B -:10BFB000A5F8031030806A1D694604F10C0006F0F4 -:10BFC000CAF910B1CCE01021EDE730889DF80010DF -:10BFD000084456E00EE10A2028702089A5F80100E7 -:10BFE0003180B2E00C2129702189A5F80110618906 -:10BFF000A5F803103080A8E0218933880BEB4102BB -:10C000001FFA82FA534576D3BAF1050F73D30E2285 -:10C010002A7008EA410100E07FE0CDE9001B60885A -:10C020002A467146E368FFF7BBFEA6F800A0D2E0FF -:10C030006048417A002970D0491E41724068217AD7 -:10C04000E26800EBC105D046A9882868D2F800C094 -:10C050000844A0F1080140F808CC506848608DF809 -:10C0600000308DF801A028680290A888ADF804007F -:10C0700060886946F5F7C6FEA5F80480002E01D059 -:10C0800040463080A7E0287840F080022A70287867 -:10C0900040F040022A7060893288C01C1FFA80F884 -:10C0A00042455DD3287820F03F0012302870228965 -:10C0B000A5F801206089CDE9000160882A46714613 -:10C0C000E368FFF76DFEA6F80080287841063CD5AE -:10C0D00000065ED58DF800B08DF801A03188CDE95D -:10C0E000025A091DADF804100420DFF8C88003E0EF -:10C0F00059E04FE02DE033E0049098F808008DF807 -:10C10000140060886946F5F77DFE074630880C30DC -:10C110003080022F02D0E7B36FE048E09DF8142092 -:10C12000D8F8041098F80830404601EBC2019A4252 -:10C1300016D28A88A2B9427A521C88F809200D606A -:10C1400030888880A6F800A057E061682089888040 -:10C1500041E0A1893288491D1FFA81F8424501D288 -:10C1600004274AE029782A4621F03F011631297038 -:10C170002189A5F801106189A5F80310A189CDE9ED -:10C180000010608871462369FFF70AFEA6F8008058 -:10C19000DBE720E0287820F03F0018302870207A74 -:10C1A0006870338017E060680188090404D40527AB -:10C1B00023E00000B0060020C0882189884201D019 -:10C1C00006271AE01E202870A6F800B060680188D3 -:10C1D00021F400410180B9F1000F0ED0DF486188E1 -:10C1E000002200888300032007F044FF6168207864 -:10C1F000887007E0A6F800A003276068018821EA9C -:10C2000009010180384663E62DE9F04F87B01746F3 -:10C21000109C0D0083461E461AD03078C10703D00B -:10C2200000F03F00192801D9012100E0002120463B -:10C23000FFF723FEA8420BD32088A0F57F41FF39EA -:10C2400006D03078410601D4000603D508203FE629 -:10C2500007203DE600208DF800008DF801003078C1 -:10C260006B1E00F03F0C0122A81E4FF0050A4FF094 -:10C27000020999B2BCF1200F76D2DFE80CF08C10E5 -:10C28000755F7569758D759E75B875BD75CB75D7FC -:10C2900075E4757575F475F275F175F0758C052D8D -:10C2A00079D104208DF80000A0788DF80400708802 -:10C2B000ADF8060030798DF80100707800F03F008D -:10C2C0000C2829D00ADCA0F10200092863D2DFE89B -:10C2D00000F0126215621A621D622000122824D03A -:10C2E00004DC0E281BD01028DAD11BE016281FD042 -:10C2F0001828D5D11FE02078800701E0207840077A -:10C30000002848DAF1E020780007F9E72078C00635 -:10C31000F6E720788006F3E720784006F0E72078FB -:10C320000006EDE72088C005EAE72088C004E7E7BB -:10C3300020888004E4E720884004E1E72078800733 -:10C3400029D5032D27D18DF800A0B6F8010083E090 -:10C35000217849071FD5062D1DD381B27078012899 -:10C3600003D0022817D102E0CCE0022000E0102028 -:10C3700006228DF8002072788DF80420801CB1FB15 -:10C38000F0F2ADF8062092B242438A4203D10397FD -:10C39000ADF80890A9E07BE02078000778D5072168 -:10C3A00098B28DF800108108ADF80410B0EB810F41 -:10C3B0006ED10297ADF8062097E02178C90667D5BF -:10C3C000022D65D381B208208DF800007078022814 -:10C3D0005ED300BFB1FBF0F28DF80400ADF806208B -:10C3E00092B242438A4253D1ADF808907CE0207863 -:10C3F00080064DD5092003E02078400648D50A2064 -:10C400008DF80000A088ADF80400ADF80610ADF876 -:10C41000082069E02078000672D50B20ADF80410E2 -:10C420008DF80000ADF8062002975EE02188C9056E -:10C4300066D5022D64D381B20C208DF8000070788F -:10C4400004285DD3C6E72088C00459D5012D57D1F3 -:10C450000D208DF80000A088ADF8040045E021E033 -:10C4600026E016E0FFE72088800449D5052D47D354 -:10C470000E208DF80000A088ADF80400B6F8030087 -:10C480006D1FADF80850ADF80600ADF80AA02BE01E -:10C4900036E02088400433D5012D31D10F208DF8AE -:10C4A000000022E0208800042AD4B6F80100E080D1 -:10C4B000A07B000724D5032D22D3307800F03F0065 -:10C4C0001B2819D011208DF80000208840F400406E -:10C4D000A4F80000B6F80100ADF80400ED1E03203A -:10C4E000ADF80650ADF80800039769465846F5F7D1 -:10C4F00089FC050008D016E010208DF80000E9E75F -:10C50000072510E008250EE0307800F03F001B28DA -:10C5100009D01D2807D05946032007F055FE208872 -:10C5200000F400402080A07B400708D52046FFF79C -:10C530007EFCC00703D1A07B20F00400A073284636 -:10C54000C6E400B587B0032805D18DF8000088B295 -:10C550006946F5F757FC07B000BD0000B0060020A3 -:10C56000F8B51D46DDE906470E000AD004F092FB3F -:10C570002346FF1DBCB231462A46009403F050FF0B -:10C58000F8BDD0192246194615F0B6FA2046F8BD76 -:10C590002DE9FF4F8DB09B46DDE91B57DDF87CA0F0 -:10C5A0000C46082B05D0E06901F00CF950B11020C1 -:10C5B000D2E02888092140F0100028808AF8001075 -:10C5C000022617E0E16901208871E2694FF42051E9 -:10C5D0009180E1698872E06942F601010181E069B8 -:10C5E000002181732888112140F0200028808AF8DA -:10C5F0000010042638780A900A2038704FF002099B -:10C6000004F118004D460C9001F09FFBB04681E00C -:10C61000BBF1100F0ED1022D0CD0A9EB0800801C2D -:10C6200080B20221CDE9001005AB52461E990D984B -:10C63000FFF796FFBDF816101A98814203D9F74804 -:10C6400000790F9004E003D10A9808B138702FE008 -:10C650004FF00201CDE900190DF1160352461E9963 -:10C660000D98FFF77DFF1D980088401B801B83B24B -:10C67000C6F1FF00984200D203461E990BA8D9B11B -:10C680005FF00002DDF878C0CDE9032009EB060178 -:10C6900089B2CDE901C10F980090BDF816100022B3 -:10C6A0000D9801F0D5FB387070B1C0B2832807D067 -:10C6B000BDF8160020833AE00AEB09018A19E1E788 -:10C6C000022011B0BDE8F08FBDF82C00811901F0F7 -:10C6D000FF08022D0DD09AF80120424506D1BDF881 -:10C6E0002010814207D0B8F1FF0F04D09AF80180E2 -:10C6F0001FE08AF80180C94800680178052902D145 -:10C70000BDF81610818009EB08001FFA80F905EBCF -:10C71000080085B2DDE90C1005AB0F9A01F018FB9B -:10C7200028B91D980088411B4145BFF671AF022D05 -:10C7300013D0BBF1100F0CD1A9EB0800801C81B203 -:10C740000220CDE9000105AB52461E990D98FFF776 -:10C7500007FF1D980580002038700020B1E72DE903 -:10C76000F8439C46089E13460027B26B9AB3491FB4 -:10C770008CB2F18FA1F57F45FF3D05D05518AD88EE -:10C780002944891D8DB200E000252919B6F83C80A6 -:10C790000831414520D82A44BCF8011022F8021B78 -:10C7A000BCF8031022F8021B984622F8024B91466F -:10C7B00004F05EFA4FF00C0C41464A462346CDF891 -:10C7C00000C003F0F4FDF587B16B00202944A41DDF -:10C7D0002144088003E001E0092700E08327384670 -:10C7E000BDE8F88310B50B88848F9C420CD9846B0C -:10C7F000E018048844B1848824F40044A41D234430 -:10C800000B801060002010BD822010BD2DE9F04784 -:10C810008AB00025904689468246ADF81850072711 -:10C820004BE0059806888088000446D4A8F800608C -:10C8300007A8019500970295CDE903504FF40073C6 -:10C8400000223146504601F003FB04003CD1BDF804 -:10C850001800ADF82000059804888188B44216D1EC -:10C860000A0414D401950295039521F40041009720 -:10C87000049541F4804342882146504601F0BEF8B9 -:10C8800004000BD10598818841F40041818005AAFC -:10C8900008A94846FFF7A6FF0400DCD000970598DA -:10C8A00002950195039504950188BDF81C3000227E -:10C8B000504601F0A3F8822C06D105AA06A94846E5 -:10C8C000FFF790FF0400ACD0ADF8185004E00598D5 -:10C8D000818821F40041818005AA06A94846FFF716 -:10C8E00081FF0028F3D0822C03D020460AB0BDE897 -:10C8F000F0870020FAE710B50C46896B86B051B17D -:10C900000C218DF80010A18FADF80810A16B0191DA -:10C910006946FAF7C9FB00204FF6FF71A063E18773 -:10C92000A08706B010BD2DE9F0410D460746896B82 -:10C930000020069E1446002911D0012B0FD132464B -:10C9400029463846FFF762FF002808D1002C06D0A0 -:10C95000324629463846BDE8F04100F042BFBDE806 -:10C96000F0812DE9FC411446DDE9087C0E46DDE945 -:10C970000A15521DBCF800E092B2964502D207207B -:10C98000BDE8FC81ACF8002017222A70A5F80160F0 -:10C99000A5F803300522CDE900423B462A46FFF7C1 -:10C9A000DFFD0020ECE770B50C4615464821204617 -:10C9B00015F03BF904F1080044F81C0F00204FF675 -:10C9C000FF71E06161842084A5841720E08494F8DD -:10C9D0002A0040F00A0084F82A0070BD4FF6FF726A -:10C9E0000A800146042007F0EFBB30B585B00C4645 -:10C9F0000546FFF780FFA18E284629B101218DF859 -:10CA000000106946FAF750FB0020E0622063606383 -:10CA100005B030BDB0F84000704700005000002065 -:10CA200090F84620920703D4408808800020F3E75E -:10CA30000620F1E790F846209207EDD5A0F84410C3 -:10CA4000EAE70146002009880A0700D5012011F015 -:10CA5000F00F01D040F00200CA0501D540F00400FB -:10CA60008A0501D540F010004A0501D540F02000AC -:10CA70000905D1D540F04000CEE700B5034690F857 -:10CA80004600C00701D0062000BDA3F8421018469A -:10CA9000FFF7D7FF10F0760F05D093F8460040F06F -:10CAA000040083F8460013F8460F40F001001870A8 -:10CAB000002000BD90F84620520700D511B1B0F813 -:10CAC0004200A9E71720A7E710F8462F61F3C30239 -:10CAD0000270A1E72DE9FF4F9BB00E00DDE92B347A -:10CAE000DDE92978289D25D02878C10703D000F0FA -:10CAF0003F00192801D9012100E000212046FFF75D -:10CB0000D9FFB04216D3287841060FD400F03F0178 -:10CB10001E2909D0218811F47F6F0BD13A884AB1C0 -:10CB2000A1F57F42FF3A05D0010606D500F03F008F -:10CB3000122802D004201FB0C4E5FC491D984FF014 -:10CB4000000A08718DF818A08DF830A00CAA0A60B0 -:10CB5000ADF81CA0ADF824A02978994601F03F0259 -:10CB6000701F5B1C04F1180CD3464FF0030ECDF878 -:10CB700028C01F2A7ED2DFE802F07D7D107D227D55 -:10CB8000AE7DF77DF67DF57DF47DF77DF37D7D7DD2 -:10CB9000F27DF17D7D7D7D7DF00094F84610B5F845 -:10CBA0000100890767D5032E65D14FF40061ADF808 -:10CBB000241060808DF830E0ADF83400E9E2052EF5 -:10CBC000F2D1B5F801002083ADF81C00B5F80310D0 -:10CBD0006183002870D088426ED884F80AB0A4F827 -:10CBE00008B04FF6FF7020840A9801F0AEF80520D7 -:10CBF00089F8000002208346029011AB1D9A0A9921 -:10CC00001B9801F0A5F820B15EE000BF8DF8180078 -:10CC1000FEE29DF84A00012804D0022089F80100B4 -:10CC2000102003E0012089F8010002200390002277 -:10CC300004A912A805F08FFBE8BB9DF8101003981B -:10CC400088423ED13A88891CA2EB0B00884238DB2F -:10CC500002990220CDE900010DF146034A46414602 -:10CC60001B98FFF77DFC02980BF1020B801C81B230 -:10CC700017AA01E0ACE2B1E0029104A912A805F004 -:10CC80006AFB02999DF81000CDE9000117AB4A46F6 -:10CC900041461B98FFF764FC9DF8100011AB0BEBAD -:10CCA00000011FFA81FB02991D9A084480B202908C -:10CCB0000A991B9801E004E091E001F049F800288E -:10CCC000B5D0BBF1020F03D10A208DF818005DE248 -:10CCD000A7F800B05AE2CDF80CB0072E7ED3B5F815 -:10CCE00001002083ADF81C00B5F803206283002802 -:10CCF00075D0904273D84FF0010B84F80AB0B5F8A4 -:10CD0000050020810020A073E06900F05BFD80B980 -:10CD1000E16942F6010081F806B0E2694FF4205162 -:10CD20009180E16981F80AB0E1690881E169002038 -:10CD30008873F01F20841E984FF0070B6062A4F8E0 -:10CD400022B00A9801F001F889F800B0012083466A -:10CD500004900020ADF846002AE026E2B0E147E169 -:10CD6000EDE01FE2B0E088E04FE000BFBBF1010F53 -:10CD700015D0E0698079012803D1BDF84400ADF8F1 -:10CD80000E0004990420CDE9000103AB4A46414658 -:10CD90001B98FFF7E5FB0498001D80B20490BDF8D6 -:10CDA0004600ADF80C00ADF80E0005981FFA80FBA8 -:10CDB00011AB1D9A0A991B9800F0CAFF28B939884F -:10CDC0000BF1040005908142D0D2BBF1010F3FF47A -:10CDD0001BAFE0698079012808D001E098E023E0EA -:10CDE000BDF84410A1F57F40FF3803D1BDF84400E1 -:10CDF000ADF80E0004990420CDE9000103AB4A46CA -:10CE000041461B98FFF7ACFB62E7072E01D0152EB9 -:10CE10007ED1B5F801102183ADF81C10B5F80320C0 -:10CE2000628309B1914201D90120EFE60121A1728B -:10CE3000A4F808B084F80EB0052E07D0C0B2691D62 -:10CE4000E26905F069FA00287FF4DEAE4FF6FF7064 -:10CE5000208401A806AA09A9CDF800B080E88603BD -:10CE60002878214600F03F031D9A1B98FFF790FB9E -:10CE70008246208BADF81C0088E10120032EC7D12B -:10CE80004021ADF82410B5F801102183ADF81C1035 -:10CE90000AAAB8F1000F00D00023CDE902030492E2 -:10CEA0001D98CDF80480009038880022401E83B27F -:10CEB0001B9800F0CDFF8DF8180050BB0B2189F8AE -:10CEC0000010BDF8280038E04FF0010C052E9FD16E -:10CED0008020ADF82400B5F801102183B5F80300D7 -:10CEE0002084ADF81C10B0F5007F01D907208DE635 -:10CEF00040F47C42228412A8B8F1000F00D0002335 -:10CF0000CDE90330CDE9018C1D980090388801E00F -:10CF10009CE007E0401E83B21B9800F099FF8DF85B -:10CF2000180028B18328A7D10220C7E050000020B4 -:10CF30000D2189F80010BDF84800401C25E1C80902 -:10CF400000EB40020EEB8200B04203D948067DD5CB -:10CF500058461AE1B5F80110ADF81C102A785206AF -:10CF600008D506228DF830202A78120605D58DF8CE -:10CF700030B02FE107228DF830200323CDE9023BAA -:10CF8000DDF878C0CDF810B01D9AA6EB000800922D -:10CF9000CDF804C01FFA88F300221B9800F02EFD84 -:10CFA0008DF818008DF830B0297849060DD5208805 -:10CFB000C00506D5208BBDF81C10884201D1C4F8ED -:10CFC00024B058468DF818B0DFE0832801D14FF027 -:10CFD000020A4FF48070ADF82400BDF81C002083D5 -:10CFE000A4F820801E986062032060841321C9E0A9 -:10CFF000052E2BD3B5F80110ADF81C10A28F32B35B -:10D00000A2F57F43FE3B29D008228DF8302005236E -:10D01000CDE9023BDDF878C0CDF810B01D9A80B2A2 -:10D02000CDF804C040F400430092B5F803201B98EB -:10D0300000F0E4FC4FF400718DF818008DF830B06A -:10D04000ADF82410832813D010B301E0DBE005E035 -:10D05000A08FA0F57F41FE3907D0D9E00B228DF8D3 -:10D0600030204FF6FE72A287D1E7A4F83CB0CFE0A3 -:10D0700000942B4631461E9A1B98FFF770FB8DF8E3 -:10D08000180008B183284BD1BDF81C0020834BE762 -:10D0900000942B4631461E9A1B98FFF760FB8DF8D3 -:10D0A0001800E8BBE18FA06B0844831D8DE888035E -:10D0B0004388828801881B98FFF753FC824665E00D -:10D0C00095F80180022E6FD15FEA080002D0B8F116 -:10D0D000010F7FD109208DF8300007A800908DF84E -:10D0E00034804346002221461B98FFF71CFC8DF834 -:10D0F00036008DF837B050B9B8F1010F11D0B8F142 -:10D10000000F04D1A08FA0F57F41FF3909D0A08F77 -:10D1100038B14FF480608DF830B0ADF824000EE0E7 -:10D1200034E00CA91B98F9F7BFFF82464FF48060EA -:10D130008DF830B0ADF82400BAF1020F06D0FB48EC -:10D140000068C07928B18DF8180027E0A4F818808D -:10D1500042E0BAF1000F03D081208DF818003BE0C7 -:10D1600007A800904346012221461B98FFF7DBFBEE -:10D170008DF8180021461B98FFF7BDFB9DF818009D -:10D1800020B9192189F80010012038809DF830005D -:10D1900020B10CA91B98F9F787FF8246BAF1000F5E -:10D1A00033D019E0062031E514E02078000711D5CE -:10D1B000012E0FD10A208DF83000E088ADF8340040 -:10D1C00004201B9907F000F80820ADF824007FE543 -:10D1D000480618D54FF0040A2088BDF824100843EB -:10D1E0002080BDF8240080050BD5A18FA1F57F40DC -:10D1F000FE3806D11E98E06228982063A6864FF07C -:10D20000030A504697E4042000E59DF8180078B121 -:10D21000012089F80000297889F80110BDF81C1058 -:10D22000A9F802109DF8180089F80400052038803C -:10D230002088BDF8241088432080E2E72DE9FF4FC5 -:10D240008846087895B0012181404FF20900249C5E -:10D250000140ADF820102088DDF88890A0F57F42CD -:10D260004FF0000AFF3A02D029B1000703D5012090 -:10D2700019B0BDE8F08F239E4FF0000B0EA886F882 -:10D2800000B018995D460988ADF83410A7498DF8AB -:10D290001CB0179A0A718DF838B0086098F8000031 -:10D2A00001283BD0022809D003286FD1307820F024 -:10D2B0003F001D303070B8F80400E08098F800108E -:10D2C0000320022904D1317821F03F011B31317054 -:10D2D00094F84610090759D505ABB9F1000F13D0E2 -:10D2E000002102AA82E80B000720CDE90009BDF861 -:10D2F0003400B8F80410C01E83B20022159800F064 -:10D30000A7FD0028D1D101E0F11CEAE7B8F804003C -:10D31000A6F80100BDF81400C01C04E198F805103F -:10D320008DF81C1098F80400012806D04FF4007AFC -:10D3300002282CD00328B8D16BE12188B8F8080066 -:10D3400011F40061ADF8201020D017281CD3B4F8D8 -:10D350004010814218D3B4F84410172901D38142F8 -:10D3600012D1317821F03F01C91C3170A6F80100BB -:10D370000321ADF83410A4F8440094F8460020F0DE -:10D38000020084F8460064E105257DE176E120880D -:10D3900008F1080700F4FE60ADF8200010F0F00F6F -:10D3A0001BD010F0C00F03D03888228B9042EBD1F5 -:10D3B00099B9B878C00710D0B9680720CDE902B193 -:10D3C000CDF804B00090CDF810B0FB88BA88398849 -:10D3D000159800F013FB0028D6D12398BDF8201033 -:10D3E000401C80294ED006DC10290DD020290BD0FE -:10D3F000402987D124E0B1F5807F70D051456DD0B0 -:10D40000B1F5806F97D1DDE0C80601D5082000E0B6 -:10D41000102082460DA907AA0520CDE902218DF82A -:10D420003800ADF83CB0CDE9049608A93888CDE9BC -:10D4300000015346072221461598FFF7A9F8A7E0F7 -:10D440009DF81C2001214FF00A0A002A9BD105AB50 -:10D45000B9F1000F00D00020CDE902100720CDE97E -:10D460000009BDF834000493401E83B2218B0022D2 -:10D47000159800F0EDFC8DF81C000B203070BDF805 -:10D48000140020E09DF81C2001214FF00C0A002A16 -:10D4900022D113ABB9F1000F00D00020CDE902106A -:10D4A0000720CDE900090493BDF83400228C401E0A -:10D4B00083B2218B159800F0CBFC8DF81C000D2059 -:10D4C0003070BDF84C00401CADF8340005208DF8DC -:10D4D0003800208BADF83C00BBE000E028E0388845 -:10D4E000218B88427FF450AF9DF81C004FF0120A48 -:10D4F00000281AD1606A98B1B878C0073FF444AFE9 -:10D50000BA680720CDE902B2CDF804B00090CDF89A -:10D5100010B0FB88BA88159800F070FA8DF81C00DE -:10D52000132030700120ADF8340092E0500000204C -:10D530003988208B8142D5D19DF81C004FF0160A06 -:10D540000028A06B08D0E0B34FF6FF7000215F46C3 -:10D55000ADF808B0019027E068B1B978C907C1D12A -:10D56000E18F0DAB0844821D03968DE80C024388C1 -:10D570008288018809E0B878C007BFD0BA680DABCF -:10D5800003968DE80C02BB88FA881598FFF7E9F935 -:10D5900005005ED0072D72D076E0019005AA02A9A1 -:10D5A0002046FFF71FF90146E28FBDF808008242CE -:10D5B00001D00029F1D0E08FA16B084407800198C9 -:10D5C000E08746E09DF81C004FF0180A40B1208B20 -:10D5D000C8B13888208321461598FFF78CF938E0C8 -:10D5E00004F118000090237E012221461598FFF7D0 -:10D5F0009AF98DF81C000028EDD119203070012017 -:10D60000ADF83400E7E7052521461598FFF773F9D3 -:10D610003AE0208800F40070ADF8200050452DD18C -:10D62000A08FA0F57F41FE3901D006252CE0D8F867 -:10D6300008004FF0160A48B1A063B8F80C10A18793 -:10D640004FF6FF71E187A0F800B002E04FF6FF70DF -:10D65000A087BDF8200030F47F611AD07823002223 -:10D660000420159906F006FD98F800002071208826 -:10D67000BDF82010084320800EE000E00725208838 -:10D68000BDF8201088432080208810F47F6F1CD0C4 -:10D690003AE02188814321809DF8380020B10EA90D -:10D6A0001598F9F701FD05469DF81C000028EBD000 -:10D6B00086F801A001203070208B70809DF81C003E -:10D6C00030710520ADF83400DEE7A18EE1B1189885 -:10D6D0000DAB0088ADF834002398CDE90304CDE903 -:10D6E0000139206B0090E36A179A1598FFF7F2F959 -:10D6F000054601208DF838000EA91598F9F7D4FCDD -:10D7000000B10546A4F834B094F8460040070AD5A5 -:10D710002046FFF796F910F0760F04D114F8460F63 -:10D7200020F0040020701898BDF8341001802846BD -:10D730009EE500B585B0042806D102208DF80000D2 -:10D7400088B26946F9F7B0FC05B000BD10B5384C99 -:10D750000B782268012B02D0022B2AD111E013781A -:10D760000BB1052B01D10423137023688A889A809A -:10D770002268CB88D38022680B8913814989518123 -:10D780000DE08B8893802268CB88D38022680B8938 -:10D7900013814B8953818B899381096911612168B8 -:10D7A000F9F782FC226800210228117003D00028BA -:10D7B00000D0812010BD832010BD806B002800D0D8 -:10D7C000012070478178012909D10088B0F5205FD8 -:10D7D00003D042F60101884201D1002070470720A2 -:10D7E0007047F0B587B0002415460E460746ADF8E1 -:10D7F000144010E0069801882980811DCDE902417E -:10D800000721019404940091838842880188384656 -:10D8100000F0F4F830B906AA05A93046FEF7E2FF99 -:10D820000028E7D0822800D1002007B0F0BD00001A -:10D830005000002010B58B7883B102789A4205D150 -:10D840000B885BB102E08B79091D4BB18B789A4252 -:10D85000F9D1B0F801300C88A342F4D1002010BDFA -:10D86000812010BD072826D012B1012A27D103E05C -:10D87000497801F0070102E04978C1F3C2010529A6 -:10D880001DD2DFE801F00318080C12000AB10320D2 -:10D8900070470220704704280DD250B10DE00528D2 -:10D8A00009D2801E022808D303E0062803D00328EB -:10D8B00003D005207047002070470F20704781205B -:10D8C0007047C0B282060BD4000607D5FE48807AA6 -:10D8D0004143C01D01EBD00080B27047084670473D -:10D8E0000020704770B513880B800B781C0625D577 -:10D8F000F54CA47A844204D843F01000087000204C -:10D9000070BD956800F0070605EBD0052D78F54051 -:10D9100065F304130B701378D17803F0030341EA25 -:10D92000032140F20123B1FBF3F503FB15119268CB -:10D93000E41D00FB012000EBD40070BD906870BDB9 -:10D9400037B51446BDF8041011809DF804100A067E -:10D950001ED5C1F30013DC49A568897A814208D835 -:10D96000FE2811D1C91DC9085A422846F5F73FFBC8 -:10D970000AE005EBD00100F0070201250878954088 -:10D98000A843934018430870207820F010002070BE -:10D990003EBD2DE9F0410746C81C0E4620F00300AD -:10D9A000B04202D08620BDE8F081C74D0020344649 -:10D9B0002E60AF802881AA72E8801AE0E988491CAD -:10D9C000E980810614D4E17800F0030041EA0020E8 -:10D9D00040F20121B0FBF1F201FB12012068FFF7D8 -:10D9E00070FF2989084480B22881381A3044A06029 -:10D9F0000C3420784107E1D40020D4E72DE9FF4F13 -:10DA000089B01646DDE9168A0F46994623F440454B -:10DA1000084600F00DFB04000FD0099802F0E6FF65 -:10DA20000290207800060AD5A748817A02988142A0 -:10DA300005D887200DB0BDE8F08F0120FAE7224617 -:10DA400001A90298FFF74EFF834600208DF80C00D5 -:10DA50004046B8F1070F1AD001222146FFF702FF16 -:10DA60000028E7D12078400611D502208DF80C005F -:10DA7000ADF81070BDF80400ADF81200ADF81460F8 -:10DA80001898ADF81650CDF81CA0ADF818005FEA54 -:10DA9000094004D500252E46A84601270CE0217830 -:10DAA000E07801F0030140EA012040F20121B0FBDF -:10DAB000F1F2804601FB12875FEA494009D5B8457B -:10DAC00007D1A178207901F0030140EA0120B0429A -:10DAD00001D3BE4201D90720ACE7A8191FFA80F98B -:10DAE000B94501D90D20A5E79DF80C0028B103A97F -:10DAF0000998F9F7D7FA00289CD1B84507D1A07842 -:10DB00004FEA192161F30100A07084F804901A987B -:10DB100000B10580199850EA0A0027D0199830B151 -:10DB20000BEB06002A46199913F0E6FF0EE00BEB0B -:10DB300006085746189E099803F09AF82B46F61DDA -:10DB4000B5B239464246009502F031FC224601A9A1 -:10DB50000298FFF7C7FE9DF80400224620F010004F -:10DB60008DF80400DDE90110FFF7EAFE002061E70F -:10DB70002DE9FF4FDFF8509182461746B9F806109D -:10DB8000D9F8000001EB410100EB810440F20120D3 -:10DB9000B2FBF0F185B000FB11764D46DDF84C800C -:10DBA00031460698FFF78DFE29682A898B46611A4F -:10DBB0000C3101441144AB8889B28B4202D88420D5 -:10DBC00009B038E70699CDB2290603D5A90601D5D3 -:10DBD0008520F5E7B9F806C00CF1010C1FFA8CFCA2 -:10DBE000A9F806C0149909B1A1F800C0A90602D588 -:10DBF000C4F8088007E0104480B2A9F80800191A98 -:10DC000001EB0B00A0602246FE200699FFF798FE6C -:10DC1000E77026712078390A61F30100320AA17891 -:10DC200040F0040062F30101A17020709AF8020034 -:10DC30006071BAF80000E08000262673280602D53D -:10DC400099F80A7000E00127A80601D54FF00008F6 -:10DC50004D4600244FF007090FE0CDE90268019618 -:10DC6000CDF800900496E9882046129B089AFFF7A9 -:10DC7000C5FE0028A4D1641CE4B2BC42EDD3002050 -:10DC80009EE72DE9F047804600F0D2F9070005D065 -:10DC9000002644460C4D40F2012919E00120BDE860 -:10DCA000F087204600F0C4F90278C17802F0030240 -:10DCB00041EA0222B2FBF9F309FB13210068FFF7E6 -:10DCC00000FE304486B201E0BC060020641CA4B211 -:10DCD000E988601E8142E4DCA8F10100E88028891F -:10DCE000801B288100203870D9E710B5144631B167 -:10DCF000491E218002F07AFEA070002010BD012094 -:10DD000010BD10B5D24904460088CA88904201D39C -:10DD1000822010BD096800EB400001EB80025079C1 -:10DD2000A072D08820819178107901F0030140EA37 -:10DD30000120A081A078E11CFFF7D4FD206120889C -:10DD4000401C2080E080002010BD0121018270472E -:10DD50002DE9FF4F85B04FF6FF788246A3F800808B -:10DD600048681F460D4680788DF806004868008890 -:10DD7000ADF8040000208DF80A00088A0C88A04243 -:10DD800000D304462C8241E0288A401C2882701D62 -:10DD90006968FFF74FFDB8BB3988414501D1601E66 -:10DDA00038806888A04236D3B178307901F0030119 -:10DDB00040EA012901A9701DFFF73CFD20BB29891C -:10DDC00041452CD0002231460798FFF74BFDD8B9CA -:10DDD0002989494518D1E9680391B5F80AC0D6F8F0 -:10DDE00008B05046CDF800C002F042FFDDF800C098 -:10DDF0005A460CF1070C1FFA8CFC4B460399CDF8E0 -:10DE000000C002F097FA50B1641CA4B2204600F0A2 -:10DE10000FF90600B8D1641E2C828220D0E67C80E7 -:10DE20007079B871F088B8803178F07801F003012A -:10DE300040EA01207881A7F80C90504602F0D6FD08 -:10DE4000324607F10801FFF74DFD38610020B7E6C3 -:10DE50002DE9FF4F87B081461C469246DDF860B041 -:10DE6000DDF85480089800F0E3F805000CD048462F -:10DE700002F0BCFD2978090608D57549897A8142E6 -:10DE800004D887200BB0D6E50120FBE7CAF30906CA -:10DE90002A4601A9FFF726FD0746149807281CD03B -:10DEA00000222946FFF7DEFC0028EBD12878400647 -:10DEB00013D501208DF808000898ADF80C00BDF8C6 -:10DEC0000400ADF80E00ADF81060ADF8124002A9E4 -:10DED0004846F9F7E7F80028D4D12978E87801F026 -:10DEE000030140EA0121AA78287902F0030240EAFE -:10DEF0000220564507D0B1F5007F04D9611E81424A -:10DF000001DD0B20BEE7864201D90720BAE7801B5E -:10DF100085B2A54200D92546BBF1000F01D0ABF870 -:10DF20000050179818B1B9192A4613F0E5FDB8F159 -:10DF3000000F0DD03E4448464446169F02F0AAFE0C -:10DF40002146FF1DBCB232462B46009402F068FA0F -:10DF5000002097E72DE9F04107461D461646084682 -:10DF600000F066F804000BD0384602F03FFD21783F -:10DF7000090607D53649897A814203D8872012E5F8 -:10DF8000012010E522463146FFF7ACFC65B121784F -:10DF9000E07801F0030140EA0120B0F5007F01D8EC -:10DFA000012000E0002028700020FCE42DE9F04171 -:10DFB00007461D461646084600F03AF804000BD006 -:10DFC000384602F013FD2178090607D52049897AE1 -:10DFD000814203D88720E6E40120E4E4224631466A -:10DFE000FFF7AEFCFF2D14D02178E07801F003029A -:10DFF00040EA022040F20122B0FBF2F302FB1300E0 -:10E0000015B900F2012080B2E070000A60F301014E -:10E0100021700020C7E410B50C4600F009F828B1C3 -:10E02000C18821804079A070002010BD012010BD62 -:10E030000749CA88824209D340B1096800EB400011 -:10E040006FF00B0202EB800008447047002070471D -:10E05000BC06002010B50C4601F03AFD80B3204606 -:10E0600000F0B7FA68B32278102A09D0112A07D035 -:10E07000022A05D0032A03D0162A2ED0FFDF1DE086 -:10E08000A0781E282BD00EDC0C2824D008DC092810 -:10E0900027D2DFE800F013261726261E1E1A1C00C2 -:10E0A00012281ED11BE0302819D01ADDA0F13A0049 -:10E0B000032816D2DFE800F011150B00002010BD78 -:10E0C00013E010E043F20200F9E70420F7E70D2027 -:10E0D000F5E70F20F3E70820F1E71120EFE707202D -:10E0E000EDE70320EBE7FFDFE8E7FFDFE6E700F01F -:10E0F00070BA70B50346002002466FF02F050EE09F -:10E100009C5CA4F130060A2E02D34FF0FF3070BDA4 -:10E1100000EB800005EB4000521C2044D2B28A4242 -:10E12000EED370BD30B50A240AE0B0FBF4F304FB73 -:10E1300013008D18303005F8010C521E1846D2B26B -:10E14000002AF2D130BD30B500234FF6FF7510E044 -:10E15000040A44EA002084B2C85C6040C0F303149F -:10E16000604005EA00344440E0B25B1C84EA4010A1 -:10E170009BB29342ECD330BD10B50AF0FFF90428EE -:10E1800003D00AF0FBF9052802D108F0A0FC28B959 -:10E190000BF056FB20B107F047FB08B1012010BD82 -:10E1A000002010BD0178406819B190F8721059B97B -:10E1B00001E001F017BD90F8041129B190F80401B5 -:10E1C000042801D0012070470020704770B50C462C -:10E1D0000546062102F042FC606008B1002006E01E -:10E1E0000721284602F03AFC606018B10120207037 -:10E1F000002070BD022070BD2DE9FC470C4606468C -:10E200006946FFF7E3FF00287DD19DF8000050B17B -:10E2100007F09CFAB0427CD0214630460EF0A1F9BE -:10E22000002873D12DE008F065F9B04271D0214685 -:10E2300030460CF041FC002868D1019D95F8C800DB -:10E2400022E0012000E00020804695F835004FF0E4 -:10E25000010A4FF00009F0B195F8360080071AD591 -:10E2600084F8019084F800A084F80290A68095F8C4 -:10E270003710A171298F2181698F618185F83590CF -:10E2800044E0019D95F8040158350028DBD1A87EB3 -:10E290000028D8D0D5E7304602F0FCFC070000D1BA -:10E2A000FFDF384601F051FE40B184F801900E21A5 -:10E2B0002170A680E08084F802A027E0304602F0BA -:10E2C000D7FC070000D1FFDFB8F1000F21D038469E -:10E2D00001F0CCFEB8B19DF8000038B90198D0F833 -:10E2E000F0004188B14201D180F80090304607F03B -:10E2F000C3F884F801900B21217084F80290A68065 -:10E30000E97EA17100E004E085F81A900120BDE8E3 -:10E31000FC870020FBE71CB56946FFF757FF00B1FB -:10E32000FFDF684601F06CFCF94900208968A1F81C -:10E33000CA001CBD2DE9FC4104460E46062002F031 -:10E3400037FB0546072002F033FB2844C7B20025FF -:10E35000A8463E4417E02088401C80B22080B0428E -:10E3600002D34046A4F8008080B2B84204D3B04241 -:10E3700002D20020BDE8FC816946FFF727FF002894 -:10E38000F8D06D1CEDB2AE42E5D84FF6FF7020809C -:10E390001220EFE738B54FF6FF70ADF800000DE042 -:10E3A0000621BDF8000002F06BFB04460721BDF812 -:10E3B000000002F065FB0CB100B1FFDF00216846F0 -:10E3C000FFF7B8FF0028EBD038BD2DE9F047D1A109 -:10E3D0000F79D1F8008007F0BDF810F003F8CF4CAA -:10E3E0004FF004091020A4F8389060874FF6FF76AC -:10E3F000A4F85460A4F85660002584F8315004F85D -:10E400002E5BC6492570A5713E39A573C1F87B8086 -:10E4100081F87F707B31481E0CF029FD25751B208B -:10E42000E0824FF4A47121836083A1830321A1774B -:10E4300084F81F9020846084B848A1843E38057019 -:10E440004680B3480C300570B448103805704680DB -:10E45000BDE8F08770B5AE4C0D466060217006F0E7 -:10E46000F3FFFFF797FFFFF7B0FF207809F031FDCA -:10E4700008F02EF9217860680CF00CFC20780FF081 -:10E4800011FA28460AF071FE07F06AF921786068EF -:10E490000EF068F9BDE870400FF0A4BF10B501247C -:10E4A0000AB1002010BD21B1012903D0002420466B -:10E4B00010BD022111F0C6FBF9E72DE9F047040079 -:10E4C00000D1FFDF954D002695F8310058B16670F8 -:10E4D0001620207095F83200A07095F83300E07097 -:10E4E00085F8316068E0287840B12C22A91C2046CC -:10E4F00013F002FB102020702E705DE095F82E00C6 -:10E5000060B10120E07095F82F00A07095F8300000 -:10E5100060701120207085F82E604DE07F48022148 -:10E5200056308246FFF706FF00B1FFDFB5F8569080 -:10E53000062002F03DFA0746072002F039FA384477 -:10E54000C7B2781C00F0FF08B5F85600B84212D1E7 -:10E55000204607F04BFF50BB95F8340070B366704F -:10E56000132020702021A01C13F03DFB0220A0707E -:10E5700085F8346020E040451AD1204607F09CF829 -:10E58000E0B12078132817D1A0783C2814D1A088B6 -:10E59000072102F063FA050000D1FFDF288806F0AA -:10E5A0006BFFA088072102F06BFA00B1FFDF03E0E8 -:10E5B0002146FFF721FE08B1012049E7022150461C -:10E5C000FFF7B8FE18B9B5F856104945BCD1002080 -:10E5D0003EE772E710B5514C207828B10A21BDE81A -:10E5E0001040102001F0A1BAFFF7C6FD08B10C20C1 -:10E5F00002E00FF042FF00202071012060710A212B -:10E60000E170207010BD70B5444D0446287828B1E3 -:10E61000BDE870403221102001F087BA207818B18F -:10E62000012801D0122010E001F090FA20B110F082 -:10E630006EF808B10C2008E0207801F057FA04F1D8 -:10E640001703E21D611C0FF06FFF28710120687134 -:10E650003221E970287070BD70B5304C05462078C5 -:10E6600028B1BDE870400B21102001F05EBA287877 -:10E6700018B1012801D012200EE0FFF77DFD08B18E -:10E680000C2009E0287801F031FA691C0FF0BCFE7B -:10E6900008B1002000E007202071012060710B21EB -:10E6A000E170207070BD10B51C4C217829B130216B -:10E6B000BDE81040102001F038BA008810F02AF8A8 -:10E6C000302110B10020207100E021710120607123 -:10E6D000E170207010BD70B5104C0546207828B14F -:10E6E000BDE870403121102001F01FBA01F02EFA70 -:10E6F00008B10C2005E0287800F0010010F004F8C3 -:10E7000000202071012060713121E170207070BD06 -:10E7100058000020FFFFFFFF1F0000000607002039 -:10E7200010B5FB4C207828B13421BDE810401020F2 -:10E7300001F0FBB901F00AFA20B10FF0E8FF08B1CF -:10E740000C2002E00FF044FF0020207101206071D6 -:10E750003421E170207010BDED48017819B10F210E -:10E76000102001F0E2B900210171102181700F2108 -:10E77000C170FF2181714FF6FF710181E549496840 -:10E780000A7882728A8882814988C1810121417117 -:10E790000170704710B5DE4C207828B12B21BDE800 -:10E7A0001040102001F0C1B90821A01D05F029FA80 -:10E7B00000202071012060712B21E170207010BDBC -:10E7C00070B5D34C217829B1BDE8704043211020A9 -:10E7D00001F0ABB990F90000042816D0032814D03A -:10E7E00098B1011D11D010F1080F0ED010F10C0FCF -:10E7F0000BD010F1100F08D010F1140F05D010F14C -:10E80000280F02D01220207103E0002506F020F826 -:10E8100025714320E07001206071207077E710B50A -:10E82000BB4C217829B12A21BDE81040102001F00D -:10E830007CB9A31D012200F1100110F03AFE002066 -:10E8400020711020A0702A20E070012060712070DB -:10E8500010BD70B5AE4C0546207828B1BDE87040BB -:10E860004621102001F061B909F088FE052804D086 -:10E87000284609F01BFB002000E00C20207101203D -:10E8800060714621E170207041E770B5A04C0546EB -:10E89000207828B1BDE870404421102001F045B92E -:10E8A00001F054F938B10C2020710120607144212D -:10E8B000E17020702BE72946002006F04CFE002076 -:10E8C000F2E770B5924C0546207828B1BDE870405B -:10E8D0004221102001F029B909F091FB50B10AF052 -:10E8E000A2FF38B128780AF064FC287808F026F9ED -:10E8F000002000E00C202071012060714221E170B5 -:10E90000207004E770B5824C0546207828B1BDE838 -:10E9100070401721102001F008B901F017F938B143 -:10E920000C202071012060711721E1702070EEE64B -:10E930002946012006F00FFE0020F2E738B5744D9D -:10E940000446287828B1BDE838404D21102001F058 -:10E95000ECB8A079E179884213D021791F2910D829 -:10E9600061791F290DD80022114612F0C7FA40B96B -:10E970000022E079114612F0C1FA10B9207A072876 -:10E9800001D9122012E04FF6FF70ADF800000AF036 -:10E9900057FF90B909F0F2FD78B900216846FFF7FA -:10E9A000C9FC50B1204605F070FE002028710120FE -:10E9B00068714D21E970287038BD0C20F6E72DE90B -:10E9C000FC47534C054694F82E0020B12821112015 -:10E9D00001F0ABF89BE4282084F83000012184F892 -:10E9E0002E10A8784FF000091A2825D00EDC162822 -:10E9F00031D2DFE800F0303030303021303030308C -:10EA00003030303030303030302121212A2822D0AF -:10EA10000BDCA0F11E000C281DD2DFE800F01C1C4E -:10EA20001C1C1C1C1C1C1C1C1C0D3A38042812D25B -:10EA3000DFE800F0110211022888B0F5706F0AD2E9 -:10EA40001F20884684F82F0028886946FFF7BEFB00 -:10EA500018B1022019E0122017E09DF80000019F74 -:10EA6000002806D007F5B377019E05D106F1ED0623 -:10EA700004E007F1EC07F7E706F267166846FFF7D0 -:10EA800091FB08B1387818B10C2084F82F003EE4CF -:10EA900087F80080A878307084F82F90684601F0DD -:10EAA000AFF834E47CB51A4C0546207820B1252116 -:10EAB000102001F03AF87CBD28886946FFF786FBF4 -:10EAC000020013484FF00001A0F13E000DD00222D9 -:10EAD000227140F8461F0171E1801020A0702520AE -:10EAE000E0700120607120707CBD019A134658329D -:10EAF00082F83E109E68C0F846601E7B80F84A602F -:10EB000092F83E60002EF3D12888E080E5E700000F -:10EB1000060700205800002010B540B10478406876 -:10EB200013B1B0F8480003E0B0F84A0000E0FB2061 -:10EB30001B2908D3814206D8B2F5A47F03D340F63F -:10EB40004800824201D9122010BD002010BD2DE9DD -:10EB5000FC41FA4D0446287828B1BDE8FC4150211B -:10EB6000102000F0E2BF4FF0010885F805801F215A -:10EB700029711021A9705021E9702188E98085F858 -:10EB8000008020886946FFF721FB08B102200DE0D4 -:10EB90002289E18801236846FFF7BEFF30B9A288C9 -:10EBA000618800236846FFF7B7FF10B12871BDE800 -:10EBB000FC819DF800103A20019E002749B186F89B -:10EBC0008981019991F8C81106F5C476B9B1287107 -:10EBD00013E086F8FD80019991F82011FC36002998 -:10EBE000F5D12F71E08870802089B0806088F08036 -:10EBF000A0883081012201990CE07770D7E72F714E -:10EC0000E08870802089B0806088F080A0883081A2 -:10EC100001990022304610F091FD86F80080ECE763 -:10EC200070B5C64D044686B0287830B106B0512183 -:10EC3000BDE87040102000F078BF01206871002608 -:10EC40002E711021A9705121E9702870208803A924 -:10EC5000FFF7BCFA18B10220287106B057E59DF8FD -:10EC60000C0040B100220499E088B1F84830984285 -:10EC700003D9C01A02E00122F5E70020E88063888A -:10EC8000B1F84A00834201D9181A00E00020288117 -:10EC9000009601960296E088ADF802002089ADF852 -:10ECA00004006088ADF80600A088ADF8080068464A -:10ECB00010F044FD2089BDF80410401A6881A08836 -:10ECC000BDF80810401AA881E088BDF80210401A6B -:10ECD000E988884200DC0846E8806088BDF80610B4 -:10ECE000401A2989884200DC08462881B5E770B5BA -:10ECF000924D0446287828B1BDE870403E2110208E -:10ED000000F013BF00F022FF20B10FF000FD08B1AA -:10ED10000C2008E0E2792078611C0FF07BFE08B13E -:10ED2000002000E002202871012068713E21E97076 -:10ED30002870ECE47CB5814C05461F2084F82F0038 -:10ED400028886946FFF742FA18B1022084F82F009C -:10ED50007CBDAA7802B90322EB7803B903239DF89E -:10ED600000603A2501210020002E019E06D086F881 -:10ED70009311019E96F8DC6146BB1FE086F80711EF -:10ED8000019E96F82C613EB9019E96F806611EB967 -:10ED9000019E96F87B6016B184F82F500AE0019D21 -:10EDA00085F80611019981F80821019981F8093146 -:10EDB00084F82F00019981F807017CBD019E96F827 -:10EDC00092611EB9019E96F87B6016B184F82F50AF -:10EDD0000AE0019D85F89211019981F89421019929 -:10EDE00081F8953184F82F00019981F893017CBD59 -:10EDF000524930B491F82E2022B1562130BC112056 -:10EE000000F093BE562281F83020012281F82E2096 -:10EE10008378DA0802D1C278D40801D0122004E045 -:10EE20005B0701D4520704D5112081F82F0030BCB4 -:10EE3000704730BC7EE770B5404C0546207828B15D -:10EE4000BDE870401D21102000F06FBE1F20207112 -:10EE5000012060711D21E170207009F08FFB0428F2 -:10EE60000BD0052809D0A9791220012907D031B18A -:10EE7000022904D0032929D101E00C2026E02978B9 -:10EE800009B1012922D1E97929B1012903D0022947 -:10EE900001D003291AD1698843F6FD720B1F302077 -:10EEA000934213D2AB881B1F93420FD22187A888AD -:10EEB0006087A87907F065FDE87907F0D0FD28782C -:10EEC000012805D00120002107F0F8FD20711EE483 -:10EED0000220F8E770B5194C217829B1BDE87040DF -:10EEE0001E21102000F021BE1F212171012161711E -:10EEF0001E22E270217002781221012A00D01AB974 -:10EF0000407818B1012801D0217187E40025012A39 -:10EF100009D009F033FB0C26052802D008F008FFC1 -:10EF200088B126717AE407F022FD48B107F031FD7F -:10EF3000618F208F09F070F803E0000006070020C1 -:10EF4000122020716AE4257168E42DE9F047F94C3C -:10EF500007469246B4F84400B7F84A200E4690425D -:10EF600000D31046804697F85210104600F0D4FDAA -:10EF7000B4F84610814200D208460546A146B4F8CE -:10EF80004840B7F84800844200D3044697F851102F -:10EF900000F0C2FDB9F84A10814200D208464FF491 -:10EFA000A4721B2C01D0904204D1B8F11B0F0DD0DC -:10EFB00095420BD0A6F8068035817480B080524609 -:10EFC0003946304610F0BAFB01203070BDE8F087BA -:10EFD0002DE9F04786B00546AFF6C800D0E90090AD -:10EFE000D44E804696F82E0028B12121112000F041 -:10EFF0009CFD06B0EAE71F2086F82F00212086F846 -:10F0000030004FF0010A86F82EA0284600F007FED7 -:10F01000002811D109F0B2FA05280CD009F0AEFA97 -:10F02000042808D096F8340028B907F063FAA0F550 -:10F030007F41FF3901D00C20AAE0BE4801AA3E382A -:10F040000190BD480290BB4806211038039004A8E7 -:10F0500001F0D4FC04007DD003210FF0DAFFB6F8F4 -:10F060004E00A4F84800B6F85000A4F84A0096F8FC -:10F070004D00009096F84C30B6F85020B6F84E107F -:10F08000208801F07EFD00B1FFDF208806F0F3F953 -:10F09000218804F10E0000F068FDA8A004F1120719 -:10F0A000006800900321684604F033FD00206946A3 -:10F0B0000A5C3A54401CC0B20328F9D3288A608005 -:10F0C000688AA080A88AE08094F8522094F85110B1 -:10F0D000B6F8520009F01DF80146A062204609F07A -:10F0E00038F8002784F85E7084F85F70687900F063 -:10F0F000FDFC6076D5F80600C4F81A006889E08344 -:10F10000C4F8089084F80C8084F8F8A0012204F177 -:10F11000FC012046FFF719FF8DF8007001216846B9 -:10F1200004F0F7FC9DF8000000F00701C0F3C102F5 -:10F130001144C0F3401008448DF80000401D2076B3 -:10F14000092801D208302076002120460FF061FF07 -:10F15000287B00E010E007F014FC69792879AA1DEB -:10F1600007F0E5FB50B107F014FC69792879AA1D76 -:10F1700007F080FC78B118E0092009E0208806F04B -:10F180007BF92088062101F07BFC00B1FFDF122013 -:10F1900086F82F002DE72146032007F08FFC20B9C9 -:10F1A0006A882988204608F0C0FE86F82F000028CB -:10F1B000F0D0208806F060F92088062101F060FC7C -:10F1C0000028E7D0FFDF14E738B55A4C207820B18B -:10F1D0002221102000F0A9FC38BD1F20207101253C -:10F1E00065712220E070257094F8340018BB09F096 -:10F1F000C5F9052805D007F07DF9A0F57F41FF3955 -:10F2000019D000202071684608F055FF0028E3D18E -:10F210000098008806F030F900980621008801F077 -:10F220002FFC00B1FFDF444884F834500C380078DC -:10F23000FCF760FD38BD0C20207138BD2DE9F04190 -:10F240003C4D044695F82E0028B1BDE8F04123213D -:10F25000112000F06ABC1F2085F82F00232085F8BC -:10F260003000012085F82E00618840F67B438A1F1C -:10F2700030209A4252D2A288961F9E424ED291428C -:10F280004CD8E188B1F5FA7F48D2218940F677461B -:10F29000A1F10A03B34241D2B1EBD20F3ED9618949 -:10F2A000A28991423AD84FF000082088062101F047 -:10F2B000D5FB06004FF0020707D000F093FC20B109 -:10F2C000D6F8F000017841B903E085F82F70BDE869 -:10F2D000F081D6F83C11097809B13A201EE00521E9 -:10F2E0008171D6F8F0004146A0F80880D6F8F020E9 -:10F2F000A0885081D6F8F020E0889081D6F8F020E0 -:10F300002089D081D6F8F000028943899A4204D836 -:10F310008279082A01D89A4203D3122085F82F0057 -:10F32000D5E722884280D6F8F000077085F82F10C4 -:10F33000CDE7000006070020640000201122330002 -:10F34000FEB5F84C0646207820B12421102000F0AC -:10F35000ECFBFEBD012565712420E0702570304670 -:10F3600010F042F808B1002000E0122020710028BF -:10F37000EFD1EC4884F83C503E38316840F87B1FB0 -:10F3800031790171002684F83C606946062001F05D -:10F39000F0FA00B1FFDF684601F0C9FA60B9BDF8C4 -:10F3A0000470029880F8F850684601F0C0FA18B965 -:10F3B000BDF80400B842F4D12671FEBD2DE9F0413C -:10F3C000D84D064695F82E0028B1BDE8F0412C2115 -:10F3D000112000F0AABB1F2085F82F002C2085F8F3 -:10F3E0003000012085F82E003088062101F036FB20 -:10F3F000040007D000F0F6FB20B1D4F8F010087834 -:10F4000030B901E0022026E0D4F83C01007808B1D0 -:10F410003A2020E094200027005D10F0010F19D061 -:10F42000D6F802004860D6F80600886054F8F00F5D -:10F43000718910228181206806F10C010E3012F0D2 -:10F440005BFB21680320087021683088488085F8BC -:10F450002F703CE70C2085F82F0038E72DE9F041AC -:10F46000B04D04460C26287828B1BDE8F04118219B -:10F47000102000F05ABB0AF0E3F9012730BB607995 -:10F48000032824D8A179012921D8A17B03291ED8DA -:10F49000617BE1B107291AD82179052917D2DFE864 -:10F4A00001F0030C030303002288202A0FD3618894 -:10F4B0008A420CD8B1F5804F09D806F0D6F92079E8 -:10F4C00085F83600204606F098FA064600E0122637 -:10F4D0002E716F711820E8702F70F8E610B5914CFE -:10F4E000217829B11A21BDE81040102000F01DBB81 -:10F4F00001781F2902D91220207106E00021217114 -:10F500000278411C104606F0FCFA012060711A21B5 -:10F51000E170207010BD10B5824C217829B12021F6 -:10F52000BDE81040102000F000BB01781F2902D96F -:10F530001220207106E0002121710278411C104642 -:10F5400006F0CEFA012060712021E170207010BD1C -:10F550002DE9FC41734C217829B1BDE8FC411B2108 -:10F56000102000F0E2BA012767710C2121710078A8 -:10F5700000261225012802D0002866D167E006F097 -:10F5800024F900285ED006F056F900285AD00AF077 -:10F5900057F900286CD106F06FF994F8360050B195 -:10F5A000012808D0042806D0002009F005FE00B18B -:10F5B000FFDF26715CE006F0C9F8A0F57F41FF3956 -:10F5C00056D10022072101A801F018FA05004FD0FA -:10F5D00055480321856028460FF0E2FB284606F0D7 -:10F5E000BAFBB4F84E00A5F84800B4F85000A5F8EE -:10F5F0004A00B4F8520001214C3409F016FF0146CC -:10F60000A8620022284608F0CEFF6078009014F827 -:10F61000043B288834F8022934F84E1901F0B1FA75 -:10F6200000B1FFDF288805F026FF284609F0C4FD59 -:10F6300000B1FFDF2671002205F5C4712846FFF7EF -:10F6400084FC15E006F0C1F890B1257110E008F0D7 -:10F65000A7FF054609F0E8FC50B9267145B1288896 -:10F6600005F00AFF2888072101F00AFA00B1FFDF40 -:10F670001B20E0702770BDE8FC812DE9F041294C8A -:10F680000646207828B1BDE8F0412D21102000F079 -:10F690004CBA3088072101F0E1F905004FF001076D -:10F6A00020D095F8690140B995F86400142801D07C -:10F6B000152802D195F8AA0150B10C202071102014 -:10F6C000A0702D20E0703088E08067712770FEE523 -:10F6D0001022B11C05F5B57012F00EFA85F86971AB -:10F6E0000020EBE70220E9E770B50E4C05462078D4 -:10F6F00028B1BDE870402E21102000F016BA2888ED -:10F70000072101F0ABF90221A0B190F869212AB9D3 -:10F7100090F86420142A09D0152A07D00C202071F3 -:10F7200009E00000060700205800002080F8691159 -:10F730000020F4E721711020A0702E20E0702888AE -:10F74000E08001206071207070BD2DE9FC47FD4C08 -:10F750000646207828B13821102000F0E6F9BDE8EF -:10F76000FC8770884BF68032122190420AD848B14B -:10F770004FF0000830886946FEF728FD20B10220CE -:10F78000207110E021710EE0019800F15809851CEC -:10F790002F887288394648460FF0BCFA2888B8424C -:10F7A000F6D184F80480012060713821E170207066 -:10F7B000D5E77CB5E34C0546207820B149211020DF -:10F7C00000F0B3F97CBD28886946FEF7FFFC38B12C -:10F7D00002202071012060714921E17020707CBD00 -:10F7E00001987F22014680F8602080F86120002285 -:10F7F00080F86220A87801F82C0FE8784870287902 -:10F8000088702271E6E71CB5CE4C217821B15421D5 -:10F81000102000F08AF91CBD00886946FEF7D6FC6E -:10F8200048B102202071012060715421E170102143 -:10F83000A17020701CBD019890F8720000B10120E9 -:10F8400000212171A071EEE71CB5BE4C217821B1D9 -:10F850001321102000F069F91CBD00886946FEF7ED -:10F86000B5FC08B1022005E0019890F82C100129A0 -:10F8700002D00C20207106E0602100222271095C78 -:10F8800021720088E080012060711321E170102155 -:10F89000A17020701CBD2DE9F041AA4C05462078CE -:10F8A00028B1BDE8F0414A21102000F03EB9288877 -:10F8B000072101F0D3F8012358B382886D88C688E8 -:10F8C000418803EB4207BD4217D342F210777E43D3 -:10F8D000BF107943B6FBF1F1491E89B24FF4FA76B5 -:10F8E000B14200D931468D4200D22946491C521CF2 -:10F8F000B1FBF2F15143491E8AB290F8961101B959 -:10F900000284E2800020207163714A20E07023703D -:10F91000DDE40220F7E770B58A4C0546207828B16F -:10F92000BDE870404C21102000F0FFB82888072166 -:10F9300001F094F890B1A97811F0010180F8D71086 -:10F9400004D090F8D51009B109F08AFD002020718B -:10F95000012060714C21E170207070BD0220F6E73B -:10F9600078490A781AB15221102000F0DEB80278E6 -:10F970009AB142788AB142881B2A0ED382881B2A08 -:10F980000BD3C288022A08D36E4A0368423242F877 -:10F990000A3F40685060002000E0122008710120FA -:10F9A00048715222CA700870704770B5654C0546A0 -:10F9B000207828B1BDE870405321102000F0B5B880 -:10F9C000287800F0010008F0A1FB287800F0010081 -:10F9D00009F0F7FC00202071012060715321E170D3 -:10F9E000207070BD70B5574D0646287828B1BDE827 -:10F9F00070405521102000F098B8012270881146FF -:10FA000008F087FB04467088012109F00EFD84424E -:10FA100000D204463088012100F06FF8064601212B -:10FA2000002000F06AF8304401219630844206D963 -:10FA300000F19601201AB0FBF1F0401C81B2E98080 -:10FA400000202871012068715521E970287070BD6F -:10FA500070B53C4D0446287828B1BDE870404E2171 -:10FA6000102000F062B800F071F808B10C200DE031 -:10FA7000601C0EF0A5FF207800F0010005F0F8FEF4 -:10FA8000207800F0010006F080FF0020287101209E -:10FA900068714E21E970287070BD70B5294C05461B -:10FAA000207828B1BDE870404B21102000F03DB80F -:10FAB00009F0C6FE08B10C2003E0287806F031F802 -:10FAC00000202071012060714B21E170207070BD19 -:10FAD00010B50178572907D21B4A52F8211019B1E5 -:10FAE000801C8847012010BD002010BD18B10228DD -:10FAF00001D0012070470020704710B5012904D0C3 -:10FB0000022905D0FFDF204610BDC000503001E0C3 -:10FB100080002C3084B2F6E7022903D0C000703098 -:10FB200080B2704780003C30FAE7064A92F83130E4 -:10FB3000002B06D182F8320082F83310012082F8BF -:10FB40003100704706070020C420020010B508F0FD -:10FB500015FD042807D008F011FD052803D009F091 -:10FB60006FFE002800D0012010BD2DE9FE430025C6 -:10FB70000F4680460A260421404604F042F84046DB -:10FB80000FF00EFC062000F013FF044615E0694656 -:10FB9000062000F0EEFE0AE0BDF80400B84206D0F0 -:10FBA0000298042241460E3011F07AFF50B16846A7 -:10FBB00000F0BDFE0500EFD0641E002C06DD002D18 -:10FBC000E5D005E040460FF0F4FBF5E705B9FFDFAF -:10FBD000D8F800000FF0A8F8761E01D00028CAD08F -:10FBE000BDE8FE8390F8721041B990F8C81029B1B1 -:10FBF00090F8C800042801D00120A2E70020A0E767 -:10FC0000017801299DD1416891F8D520002A98D02A -:10FC1000002281F8D520406809F022BC91E710B598 -:10FC2000038843F6FD711A1F8A4223D24288141FAB -:10FC30008C421FD29A421DD8C28940F67B43911F45 -:10FC4000994217D2018A8C1F9C4213D28A4211D842 -:10FC5000428AB2F5FA7F0DD2828A40F67744A2F149 -:10FC60000A03A34206D2B2EBD10F03D9C18A028B99 -:10FC7000914201D9302010BD017911B1012910D173 -:10FC800007E0417929B1012903D0022901D00329D4 -:10FC900007D1007B38B1012805D0022803D0032802 -:10FCA00001D0122010BD002010BD00000844083013 -:10FCB000424301F14A00104480B27047F0B51D463E -:10FCC0000446A818059B083000FB03F205F14A0022 -:10FCD000104486B2B14238BFFFDF0027276067605B -:10FCE000A760E76027616761A761E76127624FF658 -:10FCF000FF706762A082A6F1280080B265776080FD -:10FD0000B0F5004F88BFFFDF608805F13C018842F5 -:10FD100038BFFFDF6088401B3C3880B220801B2842 -:10FD200038BF1B202080A777F0BD816188617047B4 -:10FD30002DE9F04F0D46C188044600F128080089DE -:10FD400021F4004320F4004221F4004620F400474F -:10FD50004FF0010A4FF000099A4208D100F4004028 -:10FD600001F4004188421CBF0020BDE8F08FB7427B -:10FD70000BD9617FB81B401A083885421BDC08EBA1 -:10FD800006000021058041801EE06088617F801BA5 -:10FD9000401AB0F1080B0ED4BBF11B0FB8BFFFDF48 -:10FDA0005D45D4BF29461FFA8BF1681A0204120C74 -:10FDB00018BFBA4204DD84F817900020BDE8F08F28 -:10FDC00008EB06000180428084F817A0BDE8F08FA0 -:10FDD0002DE9F041044600F12802C08820F40043D8 -:10FDE000E07D002808BFBDE8F081D0180288438874 -:10FDF00013448B423CBF0020BDE8F08100279142B4 -:10FE00009CBF0180478013D9891A0D042D0C4580B1 -:10FE10000ED0E088A61D20F40040854288BFFFDF99 -:10FE200030884FF4004121EA0000284330800AE086 -:10FE3000627F008802F108031044083081B26288B2 -:10FE4000A01D00F0A8FBE7750120BDE8F08130B4EB -:10FE5000B0F804C0C488034600F128052CF4004023 -:10FE60002844A44503D10020188230BC7047B3F861 -:10FE70000CC00488A44509D34088ACEB040CA0EB6B -:10FE80000C0084B20CEB0500C01E06E0A4EB0C04D1 -:10FE90005D7FA4B2AC446044401DB1F800C0A445ED -:10FEA00088BF0C80B3F80CC0BCF1000F0CBF4FF042 -:10FEB000010C4FF0000C82F800C00988198230BC98 -:10FEC00070472DE9F041044600F12801808820F4B4 -:10FED00000404518208A002808BFBDE8F081A089AD -:10FEE00010B9A069807F2871A089218A084480B256 -:10FEF000A08129886A881144814238BFFFDF2888A1 -:10FF00006D88A2894119002791421AD175B1A08844 -:10FF1000261D20F40040A84238BFFFDF30884FF490 -:10FF2000004121EA00002843308009E0627F10444C -:10FF3000083081B202F108036288201D00F02BFB1B -:10FF4000A78127820120BDE8F0812DE9F047418992 -:10FF5000B0F804800027044600F1280A414518BF84 -:10FF60004FF400493AD000BF21F400405044468885 -:10FF70006EB1608904F10A0520F40040B04238BF38 -:10FF8000FFDF288829EA00003043288021E0637FD2 -:10FF9000008803F1080C18446389083023F40045F5 -:10FFA0006288284480B204F10A0190420BD2121AEE -:10FFB00092B20CF11B0C62452CBF03F4004229EAFB -:10FFC000030004D204E0801A80B229EA030210433D -:10FFD0000880781C618987B24145C5D13846BDE8A3 -:10FFE000F0872DE9F047B0F808800B46044600F191 -:10FFF0002801B0F80A90808828F4004C01EB0C0529 -:020000040001F9 -:10000000804504BF0020BDE8F087002A1CBF681DA2 -:10001000106023B1627F691D184611F06DFD2F88B5 -:100020006D888DB1E81987B2208904F1080620F4A3 -:100030000040A84238BFFFDF30884FF4004121EA7A -:100040000000284330800AE0607F6288C1190831CF -:1000500000F1080389B204F1080000F09CFAC845D9 -:1000600004BF208960813846BDE8F0878188C08858 -:1000700081420CBF012000207047018980888142A5 -:100080000CBF01200020704730B48488C28800F182 -:10009000280324F4004C22F40041634494421BD012 -:1000A0008289048A15191C885A88A3189D4216D380 -:1000B00012B18A4210D212E0437F0CF1080C1A19D7 -:1000C0006244408892B2801A80B22333984201D2AF -:1000D00011B104E08A4202D130BC0020704730BC2C -:1000E000012070472DE9F007B0F806C0048900F13F -:1000F000280702462CF400457E1924F400492CF40C -:10010000004A002024F400434FF00108D1450AD1F1 -:1001100004F400440CF4004C644504D05082BDE863 -:10012000F00700207047AB4208D992F81DC05B1B56 -:10013000A3EB0C03A3F10804002308E0B2F802C00B -:10014000547FACEB050CACEB040CACF10804002CB8 -:10015000E4DBB2F80EC0BCF1000F0DD0B6F800C061 -:1001600075884DB15B1B10778B42D7DBD089384443 -:10017000A0EB0C00C01E09E0A4EB0C0410778C422D -:1001800008DB507FD38918443044401D5182BDE8BC -:10019000F00770478B42A8BF82F81C80E6DABDE703 -:1001A0002DE9F05F044600F1280AC088934620F448 -:1001B00000400AEB0005608A894608B1484502D232 -:1001C0000020BDE8F09FE08980B1B5F800806E881E -:1001D00008EB0601884218BFFFDF207F4FF00007C1 -:1001E00050EA060108D0002840D04AE04FF000084D -:1001F000A17F46462971F0E7E08948B1617F01445B -:100200004819B4F81F10A0F8051094F82110C17116 -:10021000E18908EB09004944E18128806F80BBF146 -:10022000000F19D0607F298800F1080301440831CC -:1002300089B26288A01D00F0AEF9E781A07F401C62 -:10024000A077A07D00281CBFE088A082A7756782E8 -:10025000E7750120BDE8F09F607FE18908442844EC -:10026000B0F80510A4F81F10C0792EE0E089B4F8AA -:100270001F105044A0EB080020F8031D94F8211033 -:10028000817006EB090086B2E089BBF1000F48449B -:10029000E081A5F800806E800ED0E088A51D20F4D6 -:1002A0000040B04238BFFFDF28884FF4004121EA08 -:1002B000000030432880C0E7E0895044A0EB0800EC -:1002C00030F8031DA4F81F10807884F82100BEE7E1 -:1002D000818800F1280221F4004C6244B0F814C077 -:1002E000C388614518BF99420FD0818969B9806977 -:1002F00068B101898388994209D021F400412830EE -:10030000084411790079884201D1002070471046D5 -:10031000704700F12803407F01F1050C6044106034 -:100320000888002804BFD81E10600888498808443F -:1003300080B270472DE9F04115460A4600F12806C3 -:100340001C46407F531D0344108857880699002897 -:100350001CBFC01C80B226D088429CBF081A80B245 -:1003600013D9401AA042A8BF20461FFA80F8581897 -:100370004246294611F094FB002818BFBDE8F081E1 -:100380004544A4EB080084B2002001198F423CBF11 -:100390004FF0FF30BDE8F081304422462946BDE8E9 -:1003A000F04111F07DBBFA1C97B2F61ED4E72DE99F -:1003B000F04100F128071D46407F4B1D03441646BF -:1003C00008880024B1F80280069A00281CBFC01CCF -:1003D00080B21FD090429CBF101A80B20DD9801AF3 -:1003E000A842A8BF284684B299182246304611F088 -:1003F00083FB281B85B2264400204119414506D8BD -:1004000039182A46304611F077FB601984B220462D -:10041000BDE8F08108F103011FFA81F8FF1ED9E75A -:100420002DE9F04116460A4600F128071D46407F97 -:10043000531D034410880024B2F802800699002856 -:100440001CBFC01C80B21FD088429CBF081A80B25B -:100450000DD9401AA842A8BF284684B2581822468F -:10046000314611F049FB281B85B226440020411972 -:10047000414506D838442A46314611F03DFB601903 -:1004800084B22046BDE8F08108F103021FFA82F829 -:10049000FF1ED9E7401D704770B5044600F12801E2 -:1004A000C288808820F400431944904208D0A28971 -:1004B000002A04BF228A002A02D1A28A904201D1D6 -:1004C000002070BDB1F800C04D8885B1261D20F414 -:1004D0000040A84238BFFFDF30884FF4004121EAD6 -:1004E00000002843308000202082012070BD607F02 -:1004F0000CF1080100F10803084481B26288201D54 -:1005000000F049F8EFE70021C18101774182C17510 -:100510008175704703881380C289002A04BF0020B8 -:100520007047C28800F1280322F400421A440A608E -:10053000C089704710B50446808AA0F57F41FF3915 -:1005400018BFFFDFE088A082E089002818BF0120E3 -:10055000A07510BD4FF6FF71818200218175704733 -:1005600010B50446808AA0F57F41FF3908BFFFDF40 -:10057000A07D28B9A088A18A884204BF002010BDB0 -:10058000012010BD8188828A914205BF807D0028AC -:1005900000200120704710B4B0F800C02CF40044D3 -:1005A000214489B24FF4004491420AD2521A92B2C5 -:1005B0001B339A422CBF0CF4004224EA0C0104D2F3 -:1005C00004E0891A89B224EA0C021143018010BCAC -:1005D000704770B516464FF6FC72C91C01EA020559 -:1005E000D8B10446C01C20F00301A14200D0FFDFB7 -:1005F000201D012108E00246284401D2034600E004 -:100600000023491CC9B21360B142F4D916B104F1F8 -:10061000040001E04FF00000206005FB06F000F14F -:10062000040070BD024600201168002902D008466F -:1006300009681160704702680A60016070474FF6F0 -:10064000FC73C91C1940101A001F90FBF1F0C0B2D6 -:1006500070474FF6FC73C91C1940001D01FB0200D6 -:10066000704770B50C00054609D0082C00D2FFDF9A -:100670001DB1A1B2286800F044F8201D70BD0DB175 -:1006800000202860002070BD0021026803E09388EC -:100690001268194489B2002AF9D100F032B870B555 -:1006A00000260D460446082900D2FFDF206808B95D -:1006B0001EE0044620688188A94202D00168002912 -:1006C000F7D181880646A94201D100680DE005F105 -:1006D000080293B20022994209D32844491B0260C0 -:1006E00081802168096821600160206000E00026A7 -:1006F000304670BD00230B608A8002680A6001608A -:10070000704700234360021D018102607047F0B50D -:100710000F460188408815460C181E46AC4200D38F -:10072000641B3044A84200D9FFDFA019A84200D9B9 -:10073000FFDF3819F0BD2DE9F041884606460188F3 -:10074000408815460C181F46AC4200D3641B384441 -:10075000A84200D9FFDFE019A84200D9FFDF708866 -:100760003844708008EB0400BDE8F0812DE9F041C9 -:10077000054600881E461746841B8846BC4200D3A7 -:100780003C442C8068883044B84200D9FFDFA0196F -:10079000B84200D9FFDF68883044688008EB040065 -:1007A000E2E72DE9F04106881D460446701980B243 -:1007B000174688462080B84201D3C01B208060883D -:1007C000A84200D2FFDF7019B84200D9FFDF60886D -:1007D000401B608008EB0600C6E730B50D46018877 -:1007E000CC18944200D3A41A4088984200D8FFDF66 -:1007F000281930BD2DE9F041C14D04469046A87836 -:100800000E46A04200D8FFDF05EB8607B86A50F815 -:10081000240000B1FFDFB868FFF704FF05000CD02B -:10082000B86A082E40F8245000D3FFDFB54842468E -:10083000294650F82630204698472846BDE8F081E2 -:100840002DE9F0471E460400074602EB06009146DC -:100850008A46C5B227D000218846FF2800D9FFDF8D -:10086000E01C20F00300A04200D0FFDFB24500D919 -:10087000FFDFA34880F800A080F801908570C57064 -:10088000057145718671DFF87CA280F8079000261B -:100890000AF1400A8146FF1C27F003000746B8F121 -:1008A000000F03D005E04FF00101D5E709EB860109 -:1008B00088603AF8161019F8062001D04FF00000B1 -:1008C000FFF787FE761CF6B20744082EE3D3FF1C21 -:1008D00027F003002A460646B8F1000F0DD000208D -:1008E0000221FFF776FE4346002130440F46C846FA -:1008F000C01C20F003021BB110E0C9F84800EFE76C -:1009000008EB81060020B26206E000BFD6F828C0DE -:100910004CF82070401CC0B2A842F7D3491CC9B2A1 -:1009200002EB85000829E3D3001BBDE8F08710B572 -:10093000044603F0BBFC08B1102010BD2078704ABB -:10094000618802EB800092780EE0836A53F82130D0 -:1009500043B14A1C6280A180806A50F82100A060E7 -:10096000002010BD491C89B28A42EED86180052062 -:1009700010BD70B505460C46084603F097FC08B15B -:10098000102070BD082D01D3072070BD25700020F8 -:10099000608070BD0EB56946FFF7EBFF00B1FFDF69 -:1009A0006846FFF7C4FF08B100200EBD01200EBD50 -:1009B00010B50446082800D3FFDF5148005D10BD84 -:1009C0003EB5054600246946FFF7D3FF18B1FFDFA7 -:1009D00001E0641CE4B26846FFF7A9FF0028F8D0E4 -:1009E0002846FFF7E5FF001BC0B23EBD44498978A9 -:1009F000814201D9C0B27047FF2070472DE9F04114 -:100A000090460C460546062901D0072C10D13C4FD4 -:100A1000B86CFFF707FE02004FF6FF7604D0022104 -:100A2000B86CFFF70CFE00E030462880B04201D1E0 -:100A3000002003E742462146FFF7DCFE040002D116 -:100A4000288800F04FF82046F8E6A0F57F43FF3BEA -:100A500001D0082901D300207047CBE6A0F57F42E2 -:100A6000FF3A0BD0082909D2254A9378834205D949 -:100A700002EB8101896A51F820007047002070471D -:100A80002DE9F04105460C46A5F57F4143F20200F1 -:100A9000FF3902D0082C01D30720CFE618494FF0C8 -:100AA00000088A78AA42F8D901EB8406B26A52F8A3 -:100AB0002570002FF1D013483946203050F82420FB -:100AC00028469047B16A062C41F8258001D0072CB2 -:100AD00002D1284600F006F83946B068FFF7ABFDB2 -:100AE0000020ABE610B5064CC2B20221A06CFFF7A5 -:100AF000B0FD0146A06CBDE81040FFF79CBD0000B2 -:100B0000600700202022020070B50E461D461146E7 -:100B100000F0D4F804462946304600F0D8F82044C6 -:100B2000001D70BD2DE9F04190460D4604004FF0C8 -:100B3000000610D00027E01C20F00300A04200D0E7 -:100B4000FFDFDDB141460020FFF78BFD0C3000EBED -:100B5000850617B112E00127EDE7614F04F10C00A3 -:100B6000A9003C602572606000EB85002060606831 -:100B700011F05BF841463868FFF773FD3046BDE879 -:100B8000F0812DE9FF4F564C804681B020689A468F -:100B9000934600B9FFDF2068027A424503D94168D5 -:100BA00051F8280020B143F2020005B0BDE8F08FF3 -:100BB0005146029800F082F886B258460E9900F02D -:100BC00086F885B27019001D87B22068A1463946A3 -:100BD0000068FFF764FD04001FD067802580294668 -:100BE000201D0E9D07465A4601230095FFF766F823 -:100BF0002088314638440123029ACDF800A0FFF73F -:100C00005DF82088C1193846FFF78FF8D9F8000041 -:100C10004168002041F82840C7E70420C5E770B5C7 -:100C20002F4C0546206800B9FFDF2068017AA942F1 -:100C30000ED9426852F8251051B1002342F82530F0 -:100C40004A880068FFF756FD216800200A7A08E00C -:100C500043F2020070BD4B6853F8203033B9401C9A -:100C6000C0B28242F7D80868FFF70EFD002070BDC1 -:100C700070B51B4E05460024306800B9FFDF3068B0 -:100C8000017AA94204D9406850F8250000B1041D3A -:100C9000204670BD70B5124E05460024306800B97C -:100CA000FFDF3068017AA94206D9406850F8251064 -:100CB00011B131F8040B4418204670BD10B50A4636 -:100CC0000121FEF7F3FFC01C20F0030010BD10B59A -:100CD0000A460121FEF7EAFFC01C20F0030010BD08 -:100CE0006C00002070B5044600780E46012813D031 -:100CF000072802D00B2813D10EE0A068616905789F -:100D0000052003F061FA052D0AD078230022052082 -:100D1000616903F0AFF903E00520616903F054FA5B -:100D200031462046BDE8704001F0A8B910B500F189 -:100D30003902C3799478411D64F003042340C371E0 -:100D4000DB070DD04B79547923404B710B79127925 -:100D500013400B718278C9788A4200D9817010BD26 -:100D600000224A710A71F5E74178012900D00C216F -:100D7000017070472DE9F74F88B000208C698DF81D -:100D800004000878012617460D464FF007094FF07A -:100D9000110A4FF00A0B292876D2DFE810F029005B -:100DA000D20215032D036F037E039903C703DC03EF -:100DB0000604330457047004AE04BF04E204EA04DA -:100DC0000A052C0557057A05A605C605D605F605BC -:100DD000F805050637065906AD06EA06EC061B07B8 -:100DE0003B074407550792071B08410808080D08F0 -:100DF00014B120781E2829D0D5F808805FEA0800B1 -:100E000042D001208DF80400686A02228DF8082083 -:100E100006908DF809B0286A0390A8880028EFD0C2 -:100E200098F8001091B10F2910D27DD2DFE801F0BF -:100E30007C134BDCFEFDFCFBFAF9F8089EF7F6008C -:100E4000022821D124B120780C2801D00026F9E312 -:100E50008DF80420B3E10520696A03F0B5F9A8888C -:100E60000728EED1204601F003F9022809D02046D8 -:100E700001F0FEF8032808D9204601F0F9F8072808 -:100E800003D20120207005E003E2002CB8D02078C6 -:100E90000128D6D198F80400C11F0A2903D300BF46 -:100EA00085F81CB04CE2A070D8F80010A163B8F827 -:100EB0000410A18798F8060084F83E0001202870ED -:100EC0000320207046E00728BBD1002C98D0207862 -:100ED0000D28B6D198F8031094F83B20C1F3C00058 -:100EE000C2F3C002104201D0062000E007208907AB -:100EF00007D198F805100142D2D198F806100142A6 -:100F0000CED194F83D2098F8051020EA0202114253 -:100F1000C6D194F83E2098F8061090430142BFD104 -:100F200098F80400C11F00E008E20A29B8D2617FE6 -:100F3000814201D906209AE3D8F800106160B8F820 -:100F40000410218198F80600A072012028700E205C -:100F5000207003208DF80400686A069004F13900BF -:100F60000290601D039017300490DBE0412890D17F -:100F7000204601F07DF8042802D1E078C00704D1B2 -:100F8000204601F075F80F289ED1A88CD5F80C806A -:100F900080B24FF04009666AFFF76AFE32460826C3 -:100FA00041464B460096FFF702FA0D208DF80400EB -:100FB000686A0690606A0290002101A8FFF792FE1D -:100FC0002078042808D0A07F48B1012807D0032842 -:100FD00008D0102020709CE005202070CEE184F81D -:100FE00000A033E71220F5E71128C0D1204601F018 -:100FF0003FF8042802D1E078C00719D0204601F05C -:1010000037F8062805D1E078C00711D1A07F022863 -:101010000ED0204601F02CF8112808E0B3E083E060 -:1010200072E156E136E109E1EAE0D0E017E09ED155 -:10103000102208F1010104F1480010F05DFD607814 -:10104000012809D012202070E078C00765D0A07F69 -:1010500090B301285DD060E084F8009059E0112839 -:1010600085D1204601F004F8082804D0204600F07D -:10107000FFFF132888D12869D0B16869C0B104F195 -:101080007800102208F10101064610F035FD2078A5 -:10109000082812D014202070E078C0070FD0A07F5D -:1010A000022818D06178022912D0032831D034E008 -:1010B00000208DF80400ECE02BE00920EBE70B208A -:1010C0002870296901204870206CC1E9010662E29C -:1010D00008B101287AD10B202870296981F8019084 -:1010E000606A4860206AC1E9020648E2206CE27842 -:1010F0000068C2F34402521ED04000F0010040F0EC -:10110000800000E000200874E06A48614CE2064676 -:10111000FEE3042028700520BAE185F800B08DF8C0 -:1011200004B08EE33946F4E31128C4D1204600F020 -:101130009FFF0A2802D1E078C00704D1204600F0C2 -:1011400097FF1528B7D1102208F1010104F14800DA -:1011500010F0D2FC20780A2810D01620207012201F -:10116000287029690920487004F15800486020302F -:1011700088601038C860206C086184E30B20207000 -:10118000B9E22870FEE3022895D1204600F070FFF6 -:10119000042804D3204600F06BFF082809D320461A -:1011A00000F066FF0E2886D3204600F061FF12286B -:1011B0006FD2A07F0228B8D110208DF80400686A91 -:1011C000069098F801008DF80800F6E33DE2022849 -:1011D000ABD1204600F04CFF00285AD0204600F04A -:1011E00047FF0128F9D0204600F042FF0C28F4D038 -:1011F00004208DF8080098F801008DF809005AE7DE -:101200001128FCD1002CFAD020781728F7D161786A -:10121000E06A022910D0002101EB4101182606EBFB -:10122000C1011022405808F1010110F065FC0520B1 -:10123000696A00F010FF1DE10121EDE70B28DED106 -:10124000002CDCD020781828D9D16178E06A0229F6 -:101250001BD0002101EB4101102202EBC1014158DA -:10126000B8F8010008806078E16A02280FD00020F9 -:1012700000EB4002142000EBC2000958404650F831 -:10128000032F0A604068486039E00121E2E701204D -:10129000EEE7A1E11128B2D1002CB0D020781928B6 -:1012A000ADD16078E16A022811D0002000EB400245 -:1012B0001C2000EBC2001022085808F1010110F0B8 -:1012C0001BFC0520696A00F0C6FE1A20D4E001204C -:1012D000ECE7082893D1002C91D020781A288ED1E1 -:1012E000E06A98F80120017862F347010170E16A31 -:1012F000D8F8022041F8012FB8F8060088800520B0 -:10130000696A00F0A8FE3CE3112898D1002C98D01F -:1013100020781B2893D16178E06A02290CD0002143 -:1013200001EB4101202202EBC1011022405808F1DB -:10133000010110F0E1FBE2E70121F1E785F81C90E3 -:10134000EFE338780128A6D11C2204F11C0079684B -:1013500010F017FCE079C10894F83B0001EAD001D5 -:10136000E07861F30000E070217F09B1297733E173 -:10137000217803290AD0C0073FF42DAE032028703E -:101380008DF804B0686A06904120B1E3607FA178CF -:1013900088423FF6CFAD02262671E179204621F042 -:1013A000E001E171617A21F0F0016172A17A21F02E -:1013B000F001A172FFF7BAFC2E708DF804B0686AD4 -:1013C00006908DF80890ADE638781128CFD18DF8C9 -:1013D0000490696A0691916800208DF814000391C9 -:1013E000ADF8089008466168016021898180A17A82 -:1013F000817104202070E0E238781128B7D18DF88F -:101400000490686A0690381D02AB07C883E807009D -:101410004120ADF8080000208DF8140008460C218A -:101420000170A88CCA4680B2FE684FF04009D4F81B -:101430002080FFF72FFC3146082642464B46009697 -:10144000FEF7EEFF002101A8FFF74CFCE07820F04A -:101450003E00801CE0702078052801D00F200BE0B2 -:10146000A07F20B1012802D0032803D03DE184F8F9 -:1014700000A04EE62670E9E42070E7E438780328FF -:10148000A4D178680168A1664068E06605202870EC -:101490008DF80400686A069044E63878032895D1F0 -:1014A00078680168216740686067206C68B9A07F30 -:1014B00028B1012803D0062028700420E8E785F829 -:1014C0000090FE4820646064F9E385F80090F6E33C -:1014D0003878022892D1387900287CD1A07F022860 -:1014E0000BD00328F1D1607801280BD0A07994F8B3 -:1014F0003A1001280AD0F1480BE0B86800286BD0F8 -:10150000206411E0A17994F83A00F2E7B868002865 -:10151000F5D02064E078C00701D0012901D0E74868 -:1015200002E0F8680028EAD06064CEE78DF804B0E5 -:10153000696A0691E1785846C90709D0617802299D -:1015400003D1A17F29B1012903D0A17F032900D0B4 -:101550000820287064E33878112891D1B86828628F -:1015600009202870E0782969C0070DD081F8019022 -:10157000206A4860606A886004F16800C860A07FE3 -:1015800002287FF4BFADB1E501204870206C4860AF -:1015900004F16800886004F13800C860201D08610B -:1015A000206B4861606B88612AE2E1783878C9076E -:1015B00001D0062100E00A2188428BD1207807283B -:1015C0001DD084F800A000BF8DF80490686A0690D2 -:1015D000286A039001E0CAE08DE20024ADF808A07B -:1015E0008DF81440032100F8011B5168102210F0FF -:1015F00083FA002101A8FFF775FB2C6226E408207E -:101600002070E1E738781128A7D18DF80490686A36 -:1016100006909068039000208DF814000398ADF8B0 -:1016200008A0042100F8011B102204F1680110F049 -:1016300063FA002101A8FFF755FB2078092802D0A2 -:10164000132019E73CE384F800B016E0E17838781D -:10165000C90701D0062100E00A218842ADD110223D -:1016600004F14800796810F01BFA10B104202877C3 -:10167000EAE3207809283FF4EEAC0C2081E5E0781D -:10168000C10738D0A17F012902D002291BD02EE04A -:101690000D202870296981F801B06078012809D0EF -:1016A000206A4860606A886004F16800C860103091 -:1016B000086129E5606A4860206A886004F1780062 -:1016C000C8601038F4E7C0F3440114290FD24FF07A -:1016D000006101EBB0104FEAB060E0706078012863 -:1016E00003D010202070042057E10620C4E6607863 -:1016F00001283FF476AC0E2043E538780928ADD1B7 -:1017000085F800B00F208DF80400686A06905068D4 -:101710000290002101A8FFF7E5FAE8E7E078C007AA -:101720000AD0A07F012803D10F202870042036E1C1 -:10173000102028700E2032E115202870296902201F -:101740004870206C48606078012805D004F178006A -:1017500088601038C86053E104F168008860103078 -:10176000F8E738780228CAD138790028E0D02877FD -:1017700068E338781328FBD185F800A02969082090 -:10178000487078684860607801280DD004F16800DE -:1017900088601030C860206B0861606B486104F19C -:1017A00058008861A06A22E004F17800886010384F -:1017B000F0E738780728DBD16078012801D01320C2 -:1017C00029E2A178A06A0844C1F1100110F00BFAD7 -:1017D0001220287029690920487004F158004860D7 -:1017E000203088601038C860206C086144E0C8610F -:1017F000E06A086204E138780828B9D1102204F1BF -:101800004800796810F04CF908B10B202FE72078D8 -:101810000B2812D02046FFF789FAA178A06A084465 -:10182000C1F1100110F0DFF91620287008208DF8A2 -:101830000400686A0690002072E0132028708DF87A -:1018400004B0686A06908DF808A06BE43878112817 -:101850008ED1B86828621420287029690920487040 -:1018600004F158004860103088601030C860606C27 -:1018700008616078012806D004F139004861206BC6 -:101880008861606BB3E7601D4861606B8861206BA5 -:10189000ADE7387808288ED18DF80490686A0690F4 -:1018A000286A00260D210390ADF808A08DF8146079 -:1018B00000F8011B1022796802E000007423020086 -:1018C00010F01AF9002101A8FFF70CFA2E626078D7 -:1018D000012801D01520CFE51620287008208DF8AA -:1018E0000400686A029606901BE038780B2884D1C1 -:1018F000162028706078022802D12046FFF716FAD9 -:10190000A17878680844C1F1100110F06CF901E089 -:1019100083E215E008208DF80400686A0690786874 -:101920000290A0788DF80C004DE538780F288FD103 -:10193000E079C00773D01720287009202FE01146E6 -:1019400001A8FFF7CFF9FFF7E2BB38781028A2D142 -:101950001422391D04F11C0010F013F9E16A208DE6 -:10196000A1F80900E16AA078C871E179E26A01F0A2 -:1019700003011172E16A627A0A73E16AA07A81F85E -:10198000240000E09BE1242078E6192043E1387828 -:101990001128ACD1B86828621A20287005208DF86B -:1019A0000400686A0690CAE7387803289FD16078F7 -:1019B000E16A022802D0012001E05CE2002000EB95 -:1019C0004002142000EBC2027B688A58196811603B -:1019D000596851601B212970D5E9041205234B7009 -:1019E000636A4B606678E36A022E01D0012600E04C -:1019F000002606EB460600EBC6001858C1E90202B5 -:101A0000686A4862089800F050FB9CE738780E2816 -:101A100071D16078E26A022802D0012001E0ADE1D4 -:101A2000002000EB4001102000EBC1000223105801 -:101A3000093279680EF01EFB1C20287029690420E9 -:101A40004870206A4860E06A09308860FB4881E697 -:101A500038780D284FD16178E06A022901D0012140 -:101A600000E0002101EB4101182606EBC101A2783C -:101A70004058796810F040F86078E16A022801D097 -:101A8000012000E0002000EB400206EBC200B0465F -:101A90000858A1780844C1F1100110F0A4F88DF89D -:101AA0000490686A0690286A00260390ADF808A0A2 -:101AB0008DF81460062101706178E26A022901D074 -:101AC000012100E0002101EB410308EBC301401CB0 -:101AD0005158102210F010F8002101A8FFF702F968 -:101AE0001D202E6228708DF804B0686A06900B20C5 -:101AF0008DF8080067E481E0387811287ED18DF8F0 -:101B00000490686A0690B86803900B20ADF808004E -:101B1000039880F800906278E16A022A02D00122DC -:101B200001E091E1002202EB4202102303EBC2022A -:101B300089580988A0F801106178E26A022901D069 -:101B4000012100E0002101EB4103142101EBC3015D -:101B500051580A6840F8032F4968416056E0272031 -:101B6000287001208DF814002DE424202870002016 -:101B70009FE01F204FE0387811283FD18DF8049066 -:101B8000686A0690B868039000208DF814000398E6 -:101B9000ADF808A0082606706178E26A022901D033 -:101BA000012100E0002101EB41031C2101EBC301F5 -:101BB000401C515810220FF09FFF002101A8FFF791 -:101BC00091F8202028708DF804B0686A06908DF88E -:101BD000086061E43878112810D18DF80490686AA3 -:101BE0000690B86803900820ADF808000398092112 -:101BF0000170E16909784908417000E094E0E16909 -:101C000051F8012FC0F802208988C18020781D2852 -:101C1000ABD1A4E7222028708DF804B0686A069042 -:101C20008DF808A08BE6387811287DD1B868286235 -:101C300023202870296904204870206A4860E06ADF -:101C4000093088607E4885E538780D286CD1617848 -:101C5000E06A022901D0012100E0002101EB4101ED -:101C6000202606EBC1011022405879680FF044FF8E -:101C70008DF80490686A0690286A0390ADF808A071 -:101C800080F800B06278E16A022A01D0012200E007 -:101C9000002202EB420206EBC202401C89581022CD -:101CA0000FF02AFF0020286221781D29B1D02421BD -:101CB00029708DF81400002101A8FFF713F80326FE -:101CC000DFE0E078C00702D04FF0060C01E04FF0F3 -:101CD000070C6078022809D04FF0000000EB0401E7 -:101CE00001F1090105D04FF0010004E04FF00100BF -:101CF000F4E74FF000000B78204413EA0C030B705C -:101D000010F8092F02EA0C02027004D14FF01C0CEB -:101D100084F800C092B394F801C0BCF1010F00D068 -:101D2000E3B990F800C000E053E05FEACC7804D05B -:101D30002CF00106067018260EE05FEA8C7804D5B8 -:101D40002CF0020606701E2606E05FEA4C7805D5E8 -:101D50002CF00406067021262E70032694F801C08C -:101D6000BCF1020F00D0DAB991F800C05FEACC787C -:101D700005D02CF001060E7017210FE01AE05FEA83 -:101D80008C7804D52CF002060E70192106E05FEA6B -:101D90004C7805D52CF004060E701B21217000260E -:101DA0000078D0BBCAB3C3BB1D20207035E03878A3 -:101DB000122847D1282061E42078012842D00C283D -:101DC00040D02046FEF7D0FF0B208DF80400686A53 -:101DD000069037E038784FF02608112805D01220F9 -:101DE0001070032685F800804BE08DF80490686A37 -:101DF0000690B86803900220ADF8080001208DF825 -:101E00001400039805210170297F4170114601A833 -:101E1000FEF768FF064685F80080012E12D030E0FC -:101E200001208DF80400686A069003208DF80800F0 -:101E3000287F8DF809000020287716E06C23020027 -:101E400070220200287F80B11E202070252028707B -:101E50008DF804B0686A069002208DF808003946B3 -:101E600001A8FEF73FFF06460BE00CB1FE202070F4 -:101E70009DF8040028B1002101A8FEF733FFFEF70A -:101E8000E5BF0BB03046BDE8F08FF0B587B00C462B -:101E90004E6900218DF804100120257803460227A1 -:101EA0004FF0070C85B1012D50D0022D36D1FE2008 -:101EB00030708DF80030606A059003208DF80400C2 -:101EC000207E8DF8050060E02179012922D00229C9 -:101ED00029D0032924D0042920D1B17F02291DD182 -:101EE00031780D1F042D04D30A3D032D01D31E2983 -:101EF00014D12189022911D38DF80470237020890F -:101F00009DF80410884217D20A208DF80000606AFC -:101F1000059057E070780128EED0052007B0F0BD9D -:101F20001E203070E8E771780229F6D131780C294B -:101F3000F4D18DF804C0E1E71120083402F8040B55 -:101F400094E80B0082E80B000320E7E71578112DD9 -:101F5000E4D18DF800C0656A0595956802958DF805 -:101F6000101094F804E0BEF1010F13D0BEF1020F7F -:101F70002DD0BEF1030F1CD0BEF1040FCED1ADF8B1 -:101F800004700E202870207E687000216846FEF7DD -:101F9000A9FE0CE0ADF804700B202870207E002113 -:101FA00000F01F0068706846FEF79CFE3770002046 -:101FB000B4E7ADF804708DF8103005202870207E4D -:101FC0006870277011466846FEF78CFEA6E7ADF8EC -:101FD00004C02B70207F6870607F00F00100A87043 -:101FE000A07F00F01F00E870E27F2A71C0071CD0BC -:101FF00094F8200000F00700687194F8210000F0C8 -:102000000700A87100216846FEF76CFE2868B063DF -:10201000A888B087A87986F83E00A06940787077D4 -:102020002879B0700D203070C1E7A9716971E9E7B6 -:1020300000B587B005280CD101208DF800008DF87F -:102040000400002005918DF8050001466846FEF762 -:1020500049FE07B000BD70B50C46054602F0B4F865 -:1020600021462846BDE870407823002202F002B8DD -:1020700008B1007870470C207047000070B50C0064 -:1020800005784FF000010CD021702146F3F79DF840 -:1020900072482178405D884201D1032070BD022042 -:1020A00070BDF3F792F8002070BD027B032A05D0C3 -:1020B00000220A704B780B2B02D003E004207047FB -:1020C0000A770A62027B9300521C0273C1500320FC -:1020D0007047F0B587B00F4605460124287B05EB15 -:1020E000800050F8046C7078411E0C290AD25B49BC -:1020F0003A46123101EB8000314650F8043C284644 -:10210000984704460CB1012C11D1287B401E10F0D9 -:10211000FF00287301D00324E0E70C208DF80000B5 -:10212000706A0590002101966846FFF7A7FF032C0F -:10213000D4D007B02046F0BD70B515460A46044617 -:1021400029461046FFF7C5FF064674B12078FE28E1 -:102150000BD1207E30B100202870294604F10C00FC -:10216000FFF7B7FF2046FEF7FFFD304670BD704712 -:1021700070B50E46044688210FF057FD0225012E4A -:1021800003D0022E04D0052070BD0120607000E055 -:1021900065702046FEF7E8FDA577002070BD28B1E8 -:1021A000027E1AB10A4600F10C01C5E70120704712 -:1021B00010B5044686B0052002F006F82078FE2807 -:1021C00006D000208DF8000069462046FFF7E7FFA3 -:1021D00006B010BD7FB50E4600218DF80C10417879 -:1021E0000B2903D00C2903D0002405E0846900E00A -:1021F00044690CB1217E91B16D4601462846FFF736 -:1022000054FF032809D1324629462046FFF794FFA0 -:102210009DF80C10002900D0042004B070BD04F11A -:102220000C05EAE710B590B00C4607900B48042166 -:10223000801E08900A488DF8191009900F9269467F -:1022400006A8FFF7C7FF002805D1102220460199F4 -:102250000FF052FC002010B010BD000076220200EA -:102260006C23020070B50D46040011D085B1210128 -:1022700028460FF0B8FC10224E4928460FF03CFCCF -:102280004C4801210838018044804560002070BD21 -:10229000012070BD70B5474E00240546083E10E091 -:1022A0007068AA7B00EB0410817B914208D1C17B4E -:1022B000EA7B914204D10C2229460FF0F1FB30B1A8 -:1022C000641C30888442EBDB4FF0FF3070BD204649 -:1022D00070BD70B50D46060006D02DB1FFF7DAFFD0 -:1022E000002803DB401C14E0102070BD314C083C7A -:1022F00020886288411C914201D9042070BD616828 -:10230000102201EB001031460FF0F6FB2088401C34 -:1023100020802870002070BD70B514460D0018D0C4 -:10232000BCB10021A170022802D0102811D105E013 -:10233000288870B10121A170108008E02846FFF7BD -:10234000A9FF002805DB401CA070A8892080002080 -:1023500070BD012070BD70B5054614460E000BD04F -:1023600000203070A878012808D005D91149A1F1C2 -:1023700008010A8890420AD9012070BD24B128784A -:1023800020702888000A5070022008700FE064B1A5 -:102390004968102201EB0011204610390FF0ACFB08 -:1023A000287820732888000A60731020307000207D -:1023B00070BD0000780000202DE9F04190460C46E9 -:1023C00007460025FE48072F00EB881607D2DFE8F6 -:1023D00007F00707070704040400012500E0FFDFFA -:1023E00006F81470002D13D0F548803000EB8801FA -:1023F00091F82700202803D006EB4000447001E04C -:1024000081F8264006EB44022020507081F82740D6 -:10241000BDE8F081F0B51F4614460E460546202A59 -:1024200000D1FFDFE649E648803100EB871C0CEB6A -:10243000440001EB8702202E07D00CEB46014078C8 -:102440004B784870184620210AE092F825304078F1 -:1024500082F82500F6E701460CEB41000570407854 -:10246000A142F8D192F82740202C03D00CEB440471 -:10247000637001E082F826300CEB41042023637086 -:1024800082F82710F0BD30B50D46CE4B441900221E -:10249000181A72EB020100D2FFDFCB48854200DD43 -:1024A000FFDFC9484042854200DAFFDFC548401CD3 -:1024B000844207DA002C01DB204630BDC148401CB5 -:1024C000201830BDBF48C043FAE710B50446016884 -:1024D000407ABE4A52F82020114450B102200844EC -:1024E00020F07F40F0F751FB94F90810BDE8104050 -:1024F000C9E70420F3E72DE9F047B14E803696F89E -:102500002D50DFF8BC9206EB850090F8264034E0B1 -:1025100009EB85174FF0070817F81400012806D0BB -:1025200004282ED005282ED0062800D0FFDF01F089 -:10253000E5F8014607EB4400427806EB850080F899 -:10254000262090F82720A24202D1202280F82720BE -:10255000084601F0DEF82A4621460120FFF72CFF4D -:102560009B48414600EB041002682046904796F8CD -:102570002D5006EB850090F82640202CC8D1BDE8F0 -:10258000F087022000E003208046D0E710B58C4C95 -:102590002021803484F8251084F8261084F8271030 -:1025A000002084F8280084F82D0084F82E10411EA5 -:1025B000A16044F8100B2074607420736073A073E2 -:1025C0008449E07720750870487000217C4A103CEF -:1025D00002F81100491CC9B22029F9D30120F0F7F3 -:1025E000C2F90020F0F7BFF9012084F82200F9F7C2 -:1025F00053FB7948F9F75FFB764CA41E20707748AF -:10260000F9F759FB6070BDE81040F0F739B910B523 -:10261000F0F75BF96F4CA41E2078F9F765FB607842 -:10262000F9F762FBBDE8104001F0A0B82020704728 -:102630002DE9F34F624E0025803606EB810A89B002 -:102640009AF82500202822D0691E02916049009541 -:1026500001EB00108146D0E90112C0680391CDE979 -:102660000420B08BADF81C00B07F8DF81E009DF8E3 -:102670001500C8B10227554951F820400399E219C5 -:10268000114421F07F41019184B102210FE001202A -:10269000F0F769F90020F0F766F9F0F734F901F086 -:1026A00065F886F82F508AE00427E4E700218DF8CA -:1026B0001810022801D001281BD1039839190144B0 -:1026C0000998081A20F07F4033280BD903208DF891 -:1026D00015000398C4F13201401A20F07F403224E3 -:1026E00003900CE096F8240018B9F0F753FC00288A -:1026F0004DD0322C03D214B101F02CF801E001F0DE -:1027000035F8344A107820B393465278039B121B55 -:1027100000219DF81840984601281BD0032819D0A5 -:102720005FF000008DF81E00002A04DD981A039067 -:1027300001208DF818009DF81C0000B102210398BB -:10274000274A20F07F40039003AB099801F01AF864 -:1027500010B110E00120E5E79DF81D0018B99BF8C5 -:102760000000032812D08DF81C50CDF80C808DF895 -:1027700018408DF81E509DF8180058B10398012399 -:10278000C11900221846F0F741F906E000200BB00D -:10279000BDE8F08F0120F0F7E6F899F90C2001234D -:1027A00000200199F0F732F9012086F82F008AF80D -:1027B000285003482022694680300FF0E2F911E0EA -:1027C000AC090020FF7F841E0020A107B822020070 -:1027D000AC0700208A000020233F0100F7240100FD -:1027E000FFFF3F000120D2E72DE9F05FDFF84084D2 -:1027F000064608EB860090F82550202D1FD0A8F142 -:1028000080002C4600EB8617A0F50079DFF824B491 -:1028100005E0A24607EB4A004478202C0AD0F0F7E6 -:1028200041F909EB04135A4601211B1D00F0AAFFD0 -:102830000028EED0AC4202D0334652461EE0FE489D -:1028400008B1AFF30080F0F72DF998F82F206AB1A6 -:10285000D8F80C20411C891A0902CA1701EB126131 -:102860000912002902DD0020BDE8F09F3146FFF784 -:10287000DFFE08B10120F7E733462A462021042075 -:10288000FFF7C8FDEFE72DE9F041E94C2569F0F7C6 -:1028900009F9401B0002C11700EB1160001200D4BF -:1028A000FFDF94F8220000B1FFDF012784F82270D7 -:1028B00094F82E00202800D1FFDF94F82E6020200D -:1028C00084F82E00002584F82F5084F8205084F8D6 -:1028D0002150DA4825600078022833D0032831D00F -:1028E00000202077A068401C05D04FF0FF30A0608A -:1028F0000120F0F738F80020F0F735F8F0F733F959 -:10290000F0F72BF9EFF7FFFF0EF094FBCC480560D2 -:1029100005604FF0E0214FF40040B846C1F8800256 -:10292000F0F7BBF994F82D703846FFF75DFF0028EB -:10293000FAD0BF48803800EB871010F81600022844 -:1029400002D006E00120CCE73A4631460620FFF7E8 -:1029500033FD84F8238004EB870090F826002028BC -:1029600004D0B648801E4078F9F7C4F9207F0028CB -:1029700003D0F0F7E8F82577657749E50146AC48DC -:1029800010B590F82D200024803800EB821000BF95 -:1029900010F814302BB1641CE4B2202CF8D32020A2 -:1029A00010BDA84800EB0410016021460120FFF78C -:1029B00003FD204610BD10B5012801D0032800D129 -:1029C00071B39B4A92F82D30994C0022803C04EB65 -:1029D000831300BF13F812400CB1082010BD521C25 -:1029E000D2B2202AF6D3954A48B1022807D0072947 -:1029F00016D2DFE801F01506080A0C0E10000021BF -:102A00000AE01B2108E03A2106E0582104E0772182 -:102A100002E0962100E0B52151701070002010BD39 -:102A2000072010BD854810B54078F0F7AEF880B2A9 -:102A300010BD10B5202811D27D4991F82D30A1F19B -:102A4000800202EB831414F810303BB191F82D3062 -:102A500002EB831212F81020012A01D0002010BDD1 -:102A600091F82D2001460020FFF7A6FC012010BDA3 -:102A700010B5F0F717F8BDE81040F0F786B82DE96B -:102A8000F0410E466A4F01782025803F0C4607EB47 -:102A9000831303E0254603EB45046478944202D097 -:102AA000202CF7D108E0202C06D0A14206D103EB60 -:102AB00041014978017007E00020A9E403EB4400DC -:102AC00003EB4501407848705F4F7EB127B100218C -:102AD00040F2DA30AFF300803078A04206D127B15F -:102AE000002140F2DD30AFF30080357027B10021C6 -:102AF00040F2E230AFF30080012089E410B5426873 -:102B00000B689A1A1202D41702EB1462121216D42E -:102B1000497A91B1427A82B94C4A006852F8211040 -:102B2000126819441044001D891C081A0002C117BC -:102B300000EB11600012322801DB012010BD0020E3 -:102B400010BD2DE9F047814639483E4E00EB81002B -:102B5000984690F825402020107006F50070154624 -:102B600000EB81170BE000BF06EB04104946001D87 -:102B7000FFF7C4FF28B107EB44002C704478202CE9 -:102B8000F2D1297888F8001013E000BF06EB041595 -:102B9000291D4846FFF7B2FF68B988F80040A97BB5 -:102BA00099F80A00814201D80020E8E407EB4400CC -:102BB0004478202CEAD10120E1E42DE9FC410E46C5 -:102BC000074600241F4D08E09DF8000005EB0010AB -:102BD0008168384600F0EAFD01246B4601AA3146BF -:102BE0003846FFF7AEFF0028EED02046BDE8FC8156 -:102BF00070B504460E4801258038A54300EB8411CA -:102C000000EB851040220EF077FF0F4E26B1002119 -:102C100040F25C40AFF30080054800EB850100EB1B -:102C20008400D0F82500C1F82500AEB100210FE0E6 -:102C30002C0A0020FFFF3F00000000008A00002057 -:102C400000F50040AC07002000000000B8220200A0 -:102C50004FF48C60AFF30080284670BD2DE9FC4135 -:102C60008446FF481546089C00EB85170E4617F86A -:102C70001400012803D0022801D00020B6E70B463B -:102C8000F84A0121604600F07DFDA8B101AB6A461B -:102C900029463046FFF755FF70B1F1489DF80420F2 -:102CA0009DF80010803000EB85068A4208D02B4644 -:102CB0000520FFF7AFFB0BE02A462146042014E075 -:102CC000202903D007EB4100407801E096F8250069 -:102CD00007EB440148709DF80000202809D007EB5D -:102CE000400044702A4621460320FFF765FB01207F -:102CF0007CE706F8254F0120F070F3E7DA4901EB95 -:102D00000010001DFFF7E1BB7CB51D4613460446CD -:102D10000E4600F1080221461846EFF743FF94F9EA -:102D200008000F2804DD1F3820722068401C206036 -:102D300096B10220CD4951F8261046182068694600 -:102D4000801B20F07F40206094F908002844C01CBC -:102D50001F2803DA012009E00420EBE701AAEFF7BE -:102D600021FF9DF8040010B10098401C00900099CC -:102D7000206831440844C01C20F07F4060607CBD66 -:102D80002DE9FE430C460646097860799072207959 -:102D900098461546507241B1B148803090F82E10D7 -:102DA00020290AD00069401D0BE0D4E902232179D3 -:102DB00003B02846BDE8F043A6E7AD484178701D52 -:102DC000084420F07F47217900222846A368FFF7B6 -:102DD0009BFF3946284600F0E9FCD4E9023221790C -:102DE0006846FFF791FF41462846019CFFF7E5FE44 -:102DF0002B4622460021304600F0C4FC002803D1B7 -:102E00003146284600F0D2FCBDE8FE832DE9FE4F96 -:102E1000814600F087FC38B15FF0000799F80000A8 -:102E200020B10020BDE8FE8F0127F7E78C4D914CC3 -:102E30004FF0000A803524B1002140F2D340AFF3B7 -:102E4000008095F82D8085F823A0002624B100216C -:102E50004FF49B60AFF300801FB94046FFF7C8FEF8 -:102E6000804624B100214FF49C60AFF30080EFF75F -:102E700019FE43466A464946FFF782FF24B1002106 -:102E800040F2E640AFF3008095F82E0020280CD0E9 -:102E900029690098401A0002C21700EB1260001264 -:102EA00003D5684600F082FC012624B100214FF4CE -:102EB0009E60AFF3008095F823000028BBD124B1B9 -:102EC000002140F2F640AFF30080EFF7EBFD6B46D8 -:102ED000644A002100F056FC0028A3D027B94146DF -:102EE0006846FFF76AFE064326B16846FFF7EDFA2B -:102EF000C9F8080024B1002140F20950AFF3008066 -:102F000001208FE72DE9FF5F8A46814600F00AFC29 -:102F1000534C803410B39AF80000002710B10128F8 -:102F200000D0FFDF534D25B1002140F27F50AFF3B9 -:102F300000800120A84600905FEA080604D0002126 -:102F400040F28750AFF30080009800F0E2FB94F865 -:102F50002D50002084F8230067B119E094F82E006A -:102F60000127202800D1FFDF9AF800000028D9D0DF -:102F7000FFDFD7E72846FFF73BFE054626B10021D5 -:102F800040F29150AFF3008094F823000028D3D191 -:102F900026B1002140F29B50AFF30080EFF782FD95 -:102FA00083462B4601AA5146FFF7EAFE5FEA060870 -:102FB00004D0002140F2A250AFF300803B462A46E5 -:102FC00001A95846CDF80090FFF748FE064604EBED -:102FD000850090F828B0B8F1000F04D0002140F22D -:102FE000A950AFF3008000F089FB0090B8F1000F0A -:102FF00004D0002140F2AF50AFF3008094F82300DA -:10300000002899D1B8F1000F04D0002140F2B75048 -:10301000AFF3008014490DF1040C01EB09109CE89A -:103020000E0000F1040080E80E002EB35FEA0806EF -:1030300004D0002140F2C450AFF300803BEA070007 -:1030400020D094F82E0020281CD126B1002140F277 -:10305000C950AFF300802846FFF7C6FB90B90CE0DB -:10306000AC090020FFFF3F00AC070020B82202009F -:103070008A0000200000000010E09AF80000D8B399 -:10308000012849D0B8F1000F04D0002140F2E650E9 -:10309000AFF30080284600F02AFB01265FEA08050E -:1030A00004D0002140F2EF50AFF30080009800F010 -:1030B00030FB25B1002140F2F350AFF300808EB118 -:1030C00094F82D0004EB800090F82600202809D009 -:1030D00025B1002140F2FA50AFF30080F948407862 -:1030E000F8F708FE25B1002140F2FF50AFF3008051 -:1030F00004B03046BDE8F09FFFE7B8F1000F04D000 -:10310000002140F2D150AFF3008094F82D204946C1 -:103110000420FFF751F9C0E7002E3FF40DAF002166 -:1031200040F2DC50AFF3008006E72DE9F84FE64DA2 -:10313000814695F82D004FF00008E44C4FF0010B4C -:10314000474624B1002140F20D60AFF3008058469D -:1031500000F0DFFA85F8237024B1002140F21260FC -:10316000AFF3008095F82D00FFF742FD064695F875 -:10317000230028B1002CE4D000214FF4C3604BE0C1 -:1031800024B1002140F21C60AFF30080CE488038AB -:1031900000EB861111F81900032856D1334605EBD0 -:1031A000830A4A469AF82500904201D1012000E0A6 -:1031B000002000900AF125000021FFF760FC014685 -:1031C0000098014203D001228AF82820AF77E1B3AA -:1031D00024B1002140F22160AFF30080324649461D -:1031E0000120FFF7E9F89AF828A024B1002140F265 -:1031F0002C60AFF3008000F081FA834624B10021F7 -:1032000040F23160AFF3008095F8230038B1002C14 -:1032100097D0002140F23560AFF3008091E7BAF11A -:10322000000F07D095F82E00202803D13046FFF775 -:10323000DBFAE0B124B1002140F24960AFF3008035 -:10324000304600F054FA4FF0010824B1002140F25A -:103250005260AFF30080584600F05BFA24B10021C1 -:1032600040F25660AFF300804046BDE8F88F002C76 -:10327000F1D0002140F24460AFF30080E6E7002087 -:10328000EFF74ABB0120EFF747BB8E480078704745 -:103290002DE9F0418C4C94F82E0020281FD194F891 -:1032A0002D6004EB860797F82550202D00D1FFDF15 -:1032B0008549803901EB861000EB4500407807F81E -:1032C000250F0120F87084F82300294684F82E5039 -:1032D000324602202234FFF76FF8002020700CE401 -:1032E0002DE9F0417A4E784C012538B1012821D0E2 -:1032F000022879D003287DD0FFDFF0E700F02AFA1A -:10330000FFF7C6FF207E00B1FFDF84F821500020C8 -:10331000EFF729FBA168481C04D0012300221846BE -:10332000EFF774FB14F82E0F217806EB01110A68F1 -:10333000012154E0FFF7ACFF0120EFF714FB94F8F4 -:10334000210050B1A068401C07D014F82E0F21783E -:1033500006EB01110A68062141E0207EDFF8648156 -:10336000002708F10208012803D002281ED0FFDF41 -:10337000B5E7A777EFF7E7FB98F80000032801D13E -:1033800065772577607D534951F8200094F8201027 -:1033900051B948B161680123091A00221846EFF7B4 -:1033A00035FB022020769AE7277698E784F82050AC -:1033B00000F0D0F9A07F50B198F8010061680123B6 -:1033C000091A00221846EFF721FB257600E0277640 -:1033D00014F82E0F217806EB01110A680021BDE8D0 -:1033E000F041104700E005E036480078BDE8F041C4 -:1033F000F8F780BCFFF74CFF14F82E0F217806EB8E -:1034000001110A680521EAE710B52F4C94F82E0047 -:10341000202800D1FFDF14F82E0F21782C4A02EB70 -:1034200001110A68BDE81040042110477CB5264C04 -:10343000054694F82E00202800D1FFDFA068401C2C -:1034400000D0FFDF94F82E00214901AA01EB001003 -:10345000694690F90C002844EFF7A4FB9DF904009D -:103460000F2801DD012000E0002000990844616878 -:10347000084420F07F41A16094F82100002807D083 -:1034800002B00123BDE8704000221846EFF7BEBA33 -:103490007CBD30B5104A0B1A541CB3EB940F1FD3EC -:1034A000451AB5EB940F1BD3934203D9101A431856 -:1034B0005B1C15E0954211D9511A0844401C434247 -:1034C0000EE00000880000202C0A00200000000010 -:1034D000AC070020B8220200FF7F841EFFDF00231C -:1034E000184630BD0123002201460220EFF78EBAB4 -:1034F0000220EFF738BAEFF7D5BA2DE9FC47B14C07 -:10350000054694F82E00202800D1FFDF642D58D303 -:10351000AD4A0021521B71EB010052D394F82E20CA -:10352000A0462046DFF8A49290F82D7009EB021413 -:10353000D8F8000001AA28446946EFF733FB9DF94B -:103540000400002802DD0098401C0090A06800994B -:1035500062684618B21A22F07F42B2F5800F30D26C -:1035600008EB8702444692F82520202A0AD009EB6E -:1035700002125268101A0002C21700EB1260001209 -:1035800088421EDBA068401C10D0EFF78BFAA168C0 -:10359000081A0002C11700EB11600012022810DDAA -:1035A0000120EFF7E0F94FF0FF30A06020682844D9 -:1035B000206026F07F402061012084F82300BDE8D0 -:1035C000FC870020FBE72DE9F0477E4C074694F886 -:1035D0002D00A4F1800606EB801010F8170000B94A -:1035E000FFDF94F82D50A046794C24B1002140F61D -:1035F0006500AFF3008040F6710940F67A0A06EBE9 -:10360000851600BF16F81700012818D0042810D01E -:1036100005280ED006280CD01CB100214846AFF377 -:10362000008020BF002CEDD000215046AFF3008079 -:10363000E8E72A4639460120FEF7BEFEF2E74FF0E2 -:10364000010A4FF00009454624B1002140F68100EF -:10365000AFF30080504600F05CF885F8239024B169 -:10366000002140F68600AFF3008095F82D00FFF7AB -:10367000BFFA064695F8230028B1002CE4D00021BB -:1036800040F68C001FE024B100214FF40960AFF335 -:10369000008005EB860000F1270133463A462630CC -:1036A000FFF7EDF924B1002140F69400AFF300805C -:1036B00000F024F8824695F8230038B1002CC3D0DE -:1036C000002140F69A00AFF30080BDE785F82D6039 -:1036D000012085F82300504600F01BF8002C04D090 -:1036E000002140F6A700AFF30080BDE8F087354920 -:1036F00081F82D00012081F82300704710B535486E -:1037000008B1AFF30080EFF3108000F0010072B653 -:1037100010BD10B5002804D12F4808B1AFF30080C8 -:1037200062B610BD2D480068C005C00D10D010381D -:1037300040B2002806DA00F00F0000F1E02090F817 -:10374000140D03E000F1E02090F8000440097047F8 -:103750000820704710B51B4C94F82400002804D1B1 -:10376000F8F7B6F8012084F8240010BD10B5154C08 -:1037700094F82400002804D0F8F7D3F8002084F847 -:10378000240010BD10B51C685B68241A181A24F0B8 -:103790007F4420F07F40A14206D8B4F5800F03D2C9 -:1037A000904201D8012010BD002010BDD0E90032A8 -:1037B000D21A21F07F43114421F07F41C0E900314A -:1037C000704700002C0A0020FF1FA107AC07002053 -:1037D00000000000000000000000000004ED00E018 -:1037E000F0B5734AD2F80032724D002401212E78D0 -:1037F00056B9714E3460704F03263F1D3E606E4FC8 -:1038000004260C373E602970C2F80042D160116076 -:10381000694C4834D16425688542FBD35160D1603E -:10382000C2F80032F0BD2DE9F041044680074FF0A8 -:1038300000054FF0010604D560480560066024F0DD -:103840000204E0044FF0FF3705D55D484660C0F83C -:10385000087324F48054600003D55A48056024F0AE -:103860008044E0050FD55248C0F80052C0F80873F4 -:1038700051490D60091D0D604F4A04210C32116041 -:10388000066124F48074A00409D54F484660C0F84E -:103890000052C0F808734D48056024F40054C4F386 -:1038A0008030C4F3C031884200D0FFDF14F4404FB1 -:1038B00014D047484660C0F8087346488660C0F890 -:1038C0000052C0F8087344490D600A1D16608660F6 -:1038D000C0F808730D60166024F4404420050AD532 -:1038E0003E4846608660C0F80873C0F848733C489C -:1038F000056024F400640DF077FB3A48044200D0E0 -:10390000FFDFBDE8F08170B5202500224FEA0203F9 -:1039100020FA02F1C90719D051B201F01F060124A3 -:10392000B4404E09B60006F1E026C6F88041C6F85C -:103930008042002906DA01F00F0101F1E02181F84F -:10394000143D03E001F1E02181F80034521CAA4249 -:10395000DED370BD70B5174C0D466060FFF763FF96 -:103960006068FFF7D0FF2846F8F7A7F80CF05EFF75 -:1039700000F0ABF80DF038FB0DF083FAF8F78CF996 -:10398000BDE870400DF000B810B50A4C6068FFF754 -:103990004AFF6068FFF7B7FF0DF026FBF8F721F943 -:1039A0000020606010BD0348406870470A207047DF -:1039B000008000408C00002004850040FC1F004077 -:1039C00000C0004004E5014000D0004004D50040A4 -:1039D00000E0004000F0004000F5004000B0004072 -:1039E00008B50040FEFF0FFD70B522490A680AB312 -:1039F0000022154601244B685B1C4B60092B00D349 -:103A00004D600E7904FA06F30E681E420FD0EFF3F4 -:103A1000108212F0010272B600D001220C689C43A1 -:103A20000C6002B962B649680160002070BD521C8A -:103A3000092AE0D3052070BD4FF0E0214FF480004B -:103A4000C1F800027047EFF3108111F0010F72B658 -:103A50004FF0010202FA00F20648036842EA03024C -:103A6000026000D162B6E7E70248002101604160D0 -:103A70007047000094000020AD4911F8410F4978CB -:103A8000884201D3401A02E0C1F141010844C0B2AA -:103A90007047A749433111F8410F4978884201D353 -:103AA000401A02E0C1F141010844C0B27047A04988 -:103AB000863111F8410F4978884201D3401A02E05B -:103AC000C1F141010844C0B270479A4910B5802045 -:103AD00081F8000496490020433101F8410F4870F5 -:103AE000934901F8410F48709149863101F8410F1F -:103AF000487091480DF00EF98F48401C0DF00AF9FE -:103B0000EFF7DAF8BDE8104000F006B94020704742 -:103B1000B2E770B50C4605460026FFF7ADFF844AB4 -:103B2000A04214D30021641EE4B20FD392F84200E5 -:103B3000105C05F8010B92F84200401CC0B282F8FC -:103B400042004128EFD182F84210ECE7012600F054 -:103B5000E3F8304670BD402070479AE770B50C46D8 -:103B600005460026FFF795FF714A4332A04214D361 -:103B70000021641EE4B20FD392F84200105C05F8F5 -:103B8000010B92F84200401CC0B282F8420041286A -:103B9000EFD182F84210ECE7012600F0BDF8304684 -:103BA00070BD402101700020704710B50446FFF73A -:103BB0007EFF2070002010BD70B50C460546FFF753 -:103BC00076FF5B4A8632A04215D30021641EE4B220 -:103BD0000FD392F84200105C05F8010B92F84200F6 -:103BE000401CC0B282F842004128EFD182F8421056 -:103BF000ECE7002401E042F2070400F08DF82046D3 -:103C000070BD70B50C460546412900D9FFDF4B4811 -:103C10000068103840B200F066F8C6B20D2000F01F -:103C200062F8C0B2864203D2FFDF01E0EFF794F8FA -:103C300021462846FFF76DFF0028F7D070BD2DE91B -:103C4000F0413D4F0025064617F10407412257F881 -:103C5000254094F8421094F8410000F053F888B3DE -:103C60006D1CEDB2032DF1D331484122433090F861 -:103C7000421090F8410000F045F8002831D02C485F -:103C8000412290F8421090F8410000F03BF80028E3 -:103C900027D027484122863090F8421090F8410002 -:103CA00000F030F800281CD0EFF72CF822480DF077 -:103CB00039F8B0F5005F00D0FFDFBDE8F0411E48E5 -:103CC0000DF046B894F84100265494F84100401C89 -:103CD000C0B284F841004128C6D1002084F84100D8 -:103CE000C2E7BDE8F081002806DA00F00F0000F11D -:103CF000E02090F8140D03E000F1E02090F80004BB -:103D000040097047401C884204D0904200D109B15C -:103D1000002070470120704710B507480DF002F8E9 -:103D2000002803D1BDE81040EEF7D7BF10BD00005A -:103D30005C0A00200DE000E09C00002004ED00E0A3 -:103D4000164908784A78401CC0B2904205D0144BFE -:103D500001221A60BFF34F8F087070472DE9F041C0 -:103D60000E4C4FF0E02600BFEFF77CF820BF40BFBD -:103D700020BF677820786070D6F80052EDF7CCFA53 -:103D8000854305D1D6F8040210B92078B842EBD0AB -:103D9000EFF763F80020BDE8F0810000AC000020E0 -:103DA000180502402DE9F041012528034FF0E021DC -:103DB0000026C1F880011E4CC4F800610C2000F000 -:103DC0002CF81C4801680268C94341F3001142F015 -:103DD00010020260C4F804532560491C00E020BFB3 -:103DE000D4F80021002AFAD019B9016821F0100195 -:103DF0000160114807686560C4F80853C4F80061A1 -:103E00000C2000F00AF83846BDE8F08110B50446F1 -:103E1000FFF7C8FF2060002010BD00F01F02012145 -:103E200091404009800000F1E020C0F88012704706 -:103E300000C0004010ED00E008C500402DE9F0474B -:103E4000FF4C0646FF21A06800EB06121170217896 -:103E5000FF2910D04FF0080909EB011109EB0617F3 -:103E60004158C05900F0F4F9002807DDA168207816 -:103E700001EB061108702670BDE8F08794F8008009 -:103E800045460DE0A06809EB05114158C05900F006 -:103E9000DFF9002806DCA068A84600EB08100578CA -:103EA000FF2DEFD1A06800EB061100EB08100D709C -:103EB0000670E1E7F0B5E24B0446002001259A6860 -:103EC0000C269B780CE000BF05EB0017D75DA742DE -:103ED00004D106EB0017D7598F4204D0401CC0B262 -:103EE0008342F1D8FF20F0BD70B5FFF704FBD44C3E -:103EF00008252278A16805EB0212895800F0A8F97C -:103F0000012808DD2178A06805EB01114058BDE8C3 -:103F10007040FFF7E7BAFFF7B8F9BDE87040F7F770 -:103F2000E9BE2DE9F041C64C2578FFF7E4FAFF2DF4 -:103F30006ED04FF00808A26808EB0516915900F002 -:103F400087F90228A06801DD80595DE000EB0511CA -:103F500009782170022101EB0511425C5AB1521E11 -:103F60004254815901F5800121F07F418151284659 -:103F7000FFF764FF34E00423012203EB051302EB97 -:103F8000051250F803C0875CBCF1000F10D0BCF5DF -:103F9000007F10D9CCF3080250F806C00CEB423C6D -:103FA0002CF07F4C40F806C0C3589A1A520A09E018 -:103FB000FF2181540AE0825902EB4C3222F07F4209 -:103FC0008251002242542846FFF738FF0C21A06896 -:103FD00001EB05114158E06850F82720384690471A -:103FE0002078FF2814D0FFF786FA2278A16808EB22 -:103FF00002124546895800F02BF9012893DD2178FB -:10400000A06805EB01114058BDE8F041FFF76ABA1E -:10401000BDE8F081F0B51D4614460E460746FF2B5D -:1040200000D3FFDFA00700D0FFDF8548FF2100227B -:10403000C0E90247C5700671017042708270104677 -:10404000012204E002EB0013401CE154C0B2A8427C -:10405000F8D3F0BD70B57A4C064665782079854274 -:1040600000D3FFDFE06840F825606078401C607096 -:10407000284670BD2DE9FF5F1D468B460746FF248D -:10408000FFF739FADFF8B891064699F80100B8420F -:1040900000D8FFDF00214FF001084FF00C0A99F81B -:1040A0000220D9F808000EE008EB0113C35CFF2BD7 -:1040B0000ED0BB4205D10AEB011350F803C0DC451A -:1040C0000CD0491CC9B28A42EED8FF2C02D00DE0B8 -:1040D0000C46F6E799F803108A4203D1FF2004B09A -:1040E000BDE8F09F1446521C89F8022008EB041129 -:1040F0000AEB0412475440F802B00421029B00224C -:10410000012B01EB04110CD040F801204FF4007892 -:1041100008234FF0020C454513D9E905C90D02D01B -:1041200002E04550F2E7414606EB413203EB04134F -:1041300022F07F42C250691A0CEB0412490A8154E2 -:104140000BE005B9012506EB453103EB041321F023 -:104150007F41C1500CEB0411425499F800502046A5 -:10416000FFF76CFE99F80000A84201D0FFF7BCFEF3 -:104170003846B4E770B50C460546FFF7BCF906466D -:1041800021462846FFF796FE0446FF281AD02C4DFC -:10419000082101EB0411A8684158304600F058F896 -:1041A00000F58050C11700EBD14040130221AA68EE -:1041B00001EB0411515C09B100EB4120002800DC47 -:1041C000012070BD002070BD2DE9F0478846814672 -:1041D000FFF770FE0746FF281BD0194D2E78A86800 -:1041E0003146344605E0BC4206D0264600EB0612B6 -:1041F0001478FF2CF7D10CE0FF2C0AD0A6420CD18A -:1042000000EB011000782870FF2804D0FFF76CFE47 -:1042100003E0002030E6FFF76BF941464846FFF720 -:10422000A9FF0123A968024603EB0413FF20C85429 -:10423000A878401EB84200D1A87001EB041001E03C -:10424000280B002001EB061100780870104613E6D9 -:10425000081A0002C11700EB11600012704700003D -:1042600070B50446A0F500002D4EB0F1786F02D273 -:104270003444A4F500042B48844201D2012500E017 -:10428000002500F043F848B125B9B44204D32648CC -:10429000006808E0012070BD002070BD002DF9D13C -:1042A000B442F9D321488442F6D2F3E710B504466C -:1042B000A0F50000B0F1786F03D219480444A4F5CA -:1042C000000400F023F84FF0804130B11648006838 -:1042D00004E08C4204D2012003E014488442F8D266 -:1042E000002080F0010010BD10B520B1FFF7DEFF07 -:1042F00008B1012010BD002010BD10B520B1FFF79E -:10430000AFFF08B1012010BD002010BD08480949C9 -:104310000068884201D101207047002070470000EA -:1043200000000020003002002000002008000020D3 -:10433000B0000020BEBAFECA0548064A0168914294 -:1043400001D100210160044901200860704700008C -:10435000B0000020BEBAFECA40E50140534800212B -:104360000170417010218170704770B50546164686 -:104370000C460220EEF73FFA4C49012008704C49E8 -:10438000F01E08604B480560001F046070BD10B54A -:104390000220EEF730FA4549012008704648002116 -:1043A000C0F80011C0F80411C0F8081143494FF4D7 -:1043B0000000086010BD3D480178C9B1404A4FF483 -:1043C000000111603C49D1F800310022002B1CBFD4 -:1043D000D1F80431002B02D0D1F8081111B142708C -:1043E000102103E001214170364909688170027093 -:1043F0000020EEF700BA2D480178002904BF40786C -:1044000070472D48D0F80011002904BF02207047E2 -:10441000D0F8001100291CBFD0F80411002905D0E4 -:10442000D0F80801002804BF012070470020704721 -:104430001E4800B50278204B4078C821491EC9B2F9 -:1044400082B1D3F800C1BCF1000F10D0D3F8000145 -:1044500000281CBFD3F8040100280BD0D3F80801B2 -:1044600050B107E0022802D0012805D002E000295F -:10447000E4D1FFDF002000BD012000BD0B48017822 -:10448000002904BF807870470B48D0F8001100293C -:104490001CBFD0F80411002902D0D0F8080108B1DF -:1044A0001020704707480068C0B27047B400002071 -:1044B00010F5004008F5004000F0004004F5014010 -:1044C00008F5014000F400404C48002101704170A3 -:1044D000704770B5064614460D460120EEF78BF97D -:1044E00047480660001D0460001D056070BD70B582 -:1044F000424A012540EA01411570424A41F080716B -:104500001160414C0026C4F80461404A4FF04071EC -:104510001160002802BFC4F80052256070BD012858 -:1045200018BFFFDFC4F8006225604FF00070384903 -:10453000086070BD3148017879B1344A4FF040715C -:1045400011603149D1F804210021002A08BF4170CF -:1045500002D0304A1268427001700020EEF74BB969 -:1045600026480178002904BF407870472648D0F8D3 -:104570000401002808BF704726480068C0B2704791 -:10458000002808BF704730B51C480078002808BFD5 -:10459000FFDF1D48D0F80411002918BF30BD0224E8 -:1045A000C0F80443DFF870C0DCF80010C1F3001558 -:1045B000DCF8001041F01001CCF80010D0F8041124 -:1045C000002904BF4FF400414FF0E02207D100BFA3 -:1045D000C2F8801220BFD0F80431002BF8D02DB9DA -:1045E000DCF8001021F01001CCF80010C0F80843EE -:1045F00030BD05490120886070470000B7000020E9 -:1046000008F5004004F5004000F0004008F50140C6 -:1046100004F5014000F4004010ED00E070B5FF4CDF -:1046200000250120657025706572A572E07284F81E -:104630002150A56204F1380065630CF06BFB002883 -:1046400018BFFFDFA577F6480DF0F6FBF5494FF0F0 -:10465000FF300860091D0860091D0D60091D086014 -:10466000091D0D60091D0860091D0860091D08600D -:10467000091D0860091D0860091D0860091D086002 -:10468000091D0860091D086070BD30B4E349026867 -:10469000DFF898C34A6142688A61007A08770A7D28 -:1046A000E14BACF1040401204AB10A7E00FA02F2A7 -:1046B0001A608D7D002D0CBF2260CCF800204A7D51 -:1046C000002A04BF30BC70474A7E90401860C97D04 -:1046D00000290CBF2060CCF8000030BC7047D549E1 -:1046E000D3480860091DD4480860704710B50446D7 -:1046F000012908BF002105D002291ABFFFDF0021D0 -:104700004FF0807141F48470CA4940F48010086011 -:10471000E0B240F44030091D40F000700860C74826 -:10472000D0F80001002818BFFFDF10BD01202DE9DF -:10473000F04102254FF0E0270026C7F88051C0491C -:104740000E600860BF490A6822F0770242F08802D2 -:1047500042F000420A60091D0A6822F47F4242F4D6 -:10476000B0520A60AD4CB84965770D60B84AB74998 -:104770001160121FB7491160B74A40F25B611160C6 -:10478000121F40F203111160111F0860B34903208A -:104790000860B3499620086094F91E000CF06AFD89 -:1047A000607F002814BF4FF4C020AE48AE490860B7 -:1047B000AF49AE480860091FAE480860C7F880528C -:1047C0009E491020C1F8040384F82D60BDE8F081F3 -:1047D000A948016821F0010141F080710160704732 -:1047E0008E4A0368C2F802308088D0801172704708 -:1047F0008A4890F821007047884A517010707047BD -:10480000F0B50546800000F1804000F580508B88AF -:10481000C0F820360B78D1F8011043EA0121C0F826 -:10482000001605F10800012707FA00F6934C002A4C -:1048300004BF2068B04304D0012A18BFFFDF2068FE -:1048400030432060206807FA05F108432060F0BD7E -:1048500010B504460CF00EFD7048847710BD6F480B -:1048600090F82E0070476D4890F830007047844AE9 -:10487000C1781160006883490002086070472528EC -:1048800008BF02210ED0262808BF1A210AD02728E7 -:1048900008BF502106D00A2894BF0422062202EB4A -:1048A0004001C9B2784A116078490860704770B415 -:1048B0005A4B93F80AC0BCF1010F21D0BCF1020F92 -:1048C0001CBF70BC70475C7D002C04BF70BC70477F -:1048D0004FF47A74BCF1010F6D4E16D0DD7D93F864 -:1048E00019C0002D18BF0125012908BF292121D099 -:1048F000022A08BF674E06F2E141B1FBF4F119E06C -:104900001C7D002CE4D170BC70479D7D93F818C0CD -:10491000002D18BF0125012947D0022A06BF5E4E8F -:104920004FF47A714FF4C861314401F5FA7100BF58 -:10493000B1FBF4F1491F0844584908605849002068 -:10494000C1F84C014FEA0C2085F0010140EA01500A -:1049500040F00311187F820002F1804202F5C0424C -:10496000C2F810154F4901EB8001987EC20002F198 -:10497000804202F5F832C2F81415DFF82CC1C2F8F3 -:1049800010C5DA7ED30003F1804303F5F833C3F892 -:1049900014153849C3F81015012101FA00F09140AF -:1049A00008434249086070BC7047022A14BF4FF4A4 -:1049B000C8614FF47A7149F6FC621144B8E72DE9F9 -:1049C000F0411E4D0746032014468846C5F80002F4 -:1049D000124E707F002814BF4FF4C0202148334985 -:1049E000086040460CF094FC20460CF071FC01205D -:1049F00017B1012F60D062E02D4B19685A06022CC6 -:104A0000D2F8202314BFC2F30622C2F3066221F4B7 -:104A1000FE4141EA02211960B0724BE0380B0020E0 -:104A20004C0B0020000E0040180500500C050050F3 -:104A3000060102001415004025000302001000408A -:104A4000FC1F00403C1700406015004044800040BF -:104A50009CF5014028110040381500401015004019 -:104A6000441500400000040408F501404080004067 -:104A7000A4F501401011004074170040401600409A -:104A8000241500401C150040081500405415004036 -:104A9000A224020004360200683602004C85004061 -:104AA00000800040006000404C81004004F501405F -:104AB00088150040286002E00221B1726860F9495F -:104AC000C864F948006822464146BDE8F041EEE678 -:104AD0002DE9F0418846F549074603201546C1F8FF -:104AE0000002F34C607F002814BF4FF4C020F1484F -:104AF000F14E306040460CF00BFC28460CF0E8FB11 -:104B000017B1012F19D021E0EC490A684806022D9F -:104B1000D0F8200314BFC0F30620C0F3066022F4CF -:104B2000FE4242EA002008600120A072606B40F45F -:104B3000801060634FF4801007E00220A072606B69 -:104B400040F4001060634FF4001030602A46414684 -:104B5000BDE8F0410020AAE62DE9FF4FD34C824684 -:104B6000002681B003208946C4F80002D04D687F3A -:104B7000002814BF4FF4C020CE48CF4F38600398B0 -:104B80000CF0C6FB04980CF0A3FBCD494FF00108D4 -:104B9000BAF1000F03D0BAF1010F32D03BE0C74B9E -:104BA00004981A684FF0805C0228DCF8200314BFD8 -:104BB000C0F30620C0F3066022F4FE4242EA002061 -:104BC00018600C6095F82D00012806D0022818BF47 -:104BD000FFDF0CD085F80A801DE0DDE9031395F8AE -:104BE0002C2048460CF0E6FBA96A4618F2E7DDE9FE -:104BF000031295F82C3048460CF097FBA96A46182A -:104C0000E8E7B048086095F82D00012818BFFFDFDD -:104C100020D00220A872AC480660AD49AB480860BD -:104C2000686B40F400206863D4F800924FF0100ADB -:104C3000C4F808A30025C4F80052A6484FF4802BFE -:104C4000C0F800B0FF208DF80000C4F81051C4F87F -:104C500010800EE0DDE9031395F82C2096200CF06F -:104C600087FBA96A4618D4E79DF80000401E8DF81E -:104C700000009DF8000018B1D4F810010028F3D00E -:104C80009DF80000002808BFFFDFC4F80051C4F8F9 -:104C90000C51C4F81051C4F80451C4F81451C4F8AC -:104CA0001851C4F828518C4800680090C4F800924C -:104CB000C7F800B0C4F804A34FF400203860794866 -:104CC000C0F84C8078480068B04228BFFFDF30460B -:104CD000DDE9031205B0BDE8F04FE8E52DE9F8473E -:104CE000724CD4F8000220F00309D4F804034FF00A -:104CF000100AC0F30018C4F808A30026C4F8006224 -:104D00006B4D687F002814BF4FF4C020694871497B -:104D10000860A87A0127012802D0022803D014E0F5 -:104D2000287D10B911E0687D78B1A87EEA7E07FA87 -:104D300000F007FA02F210430860287F800000F1BB -:104D4000804000F5C040C0F81065FF208DF80000DD -:104D5000C4F81061276104E09DF80000401E8DF842 -:104D600000009DF8000018B1D4F810010028F3D01D -:104D70009DF80000002808BFFFDFC4F81061C4F8E8 -:104D800028616E72AE72EF72C4F80092B8F1000F33 -:104D900018BFC4F804A3BDE8F88700684F4920F0A5 -:104DA0007F40086070474FF0E0200221C0F880117A -:104DB000C0F8801270474FF0E0210220C1F80001D6 -:104DC000704747490870704710B546480BF0AAFF76 -:104DD000002818BFFFDF10BD42480BF0B9BF4249A1 -:104DE0000860704730B5324C0546A06AA84228BF1B -:104DF000FFDF012020732561607F40B128442061DE -:104E00002A48D0F8001241F04001C0F800122549AC -:104E10000020C1F84401354920690860606B2649CB -:104E200040F4800060634FF48000086030BD70B5CE -:104E30001F4C0546022020730CF057FA024694F8E6 -:104E40002C1028460CF0E0FA2061617F41B1084443 -:104E500020611648D0F8001241F04001C0F800125D -:104E600010490020C1F844012169A06A08441F4983 -:104E7000086070BD17494FF4800008600C48416B12 -:104E800021F480014163002101737047054801212D -:104E90004160C1600021C0F8441114480160044819 -:104EA00081627047008000404C8500400010004047 -:104EB000380B00200000040404F501408815004070 -:104EC000ACF5014004100040488500404881004096 -:104ED000A8F5014008F50140181100403C150040BC -:104EE000B9000020700B00200415004044850040EC -:104EF000FE4940204877FE490860FE48D0F800127D -:104F000041F04001C0F800127047FA48D0F8001292 -:104F100021F04001C0F80012F549022008607047F6 -:104F2000F448D0F8001221F01001C0F8001201215D -:104F300081617047EF480021C0F81C11D0F80012C1 -:104F400041F01001C0F800127047EA4981B0D1F871 -:104F50001C21012A1EBF002001B07047E64A1268DA -:104F600002F07F02524202700020C1F81C01E348A7 -:104F700000680090012001B0704730B50C00054674 -:104F800008BFFFDF14F0010F1CBF012CFFDF002D55 -:104F90000CBF01200220D54901284872CC72D549A6 -:104FA00004BFD1F8000240F0040007D0022807BF78 -:104FB000D1F8000240F00800FFDF30BDC1F8000268 -:104FC00030BD70B5C94C0023E17A11F0020F18BF53 -:104FD00010F0040F16D111F0100F1CBF94F82F2001 -:104FE000002A02D094F8312062B111F0080F1CBFE2 -:104FF00094F82020002A05D111F0040F03D094F872 -:10500000211001B9012394F809C00122B949BCF16A -:10501000000F06D000F00200184312D0BDE8704027 -:105020005CE6607F002814BF4FF4C020B448B54B45 -:105030001860D1F8000220F00300C1F80002E2720B -:1050400070BD00252846BCF1010F0BD0BCF1020F4A -:1050500018BFFFDF16D0A06A01222844BDE87040C7 -:10506000002124E4D1F8003223F00403C1F8003217 -:105070006072E272A27201231A46002196200CF09F -:1050800054F90FE0D1F8003223F00803C1F80032E0 -:105090006072E2720220A07201231A46002196205B -:1050A0000CF066F90546D6E72DE9F84F964FD7F88C -:1050B0004C218E4C93494FF00108A07A0026CAB1CA -:1050C000012802D0022803D014E0227D12B911E099 -:1050D000627D7AB1A27EE37E08FA02F208FA03F357 -:1050E0001A430A60227F920002F1804202F5C04218 -:1050F000C2F81065626B0A606663217B29B1D7F83C -:105100004411012908BF012200D00022794DD5F8B1 -:10511000101101290CBF40210021012805BFD5F83D -:105120000C31012B002320231943012805BFD5F89A -:105130000431012B002310230B437449022804BFC0 -:10514000D1F800C0BCF1010F07D1D5F80CC1BCF1FA -:10515000010F08BF4FF0080C01D04FF0000C4CEAD3 -:105160000303022804BF0968002905D1D5F80C11F2 -:10517000012908BF042100D000211943022803D1CE -:10518000002A18BF022200D100221143022804BFC6 -:10519000D5F80401012805D1D7F84401012818BF2A -:1051A000012000D1002040EA01095948016811F0AE -:1051B000FF0F03D0D5F81411012900D0002184F885 -:1051C0002E10006810F0FF0F03D0D5F81801012849 -:1051D00000D0002084F82F004E48006884F830008A -:1051E00043480068402803D1FFF705F9012800D0A3 -:1051F000002084F83100C5F80061C5F80C61C5F8DD -:105200001061C5F80461C5F81461C5F81861C5F8E6 -:105210002861414800680090C7F844613F48006831 -:105220004D46DFF8FC900090D9F800106162607F75 -:1052300000281CBF081A60623A480068A0620CF09F -:1052400054F884F82C00A07ADFF8DCA084F82D0054 -:1052500002280CD1607850B1DAF8001009780840C3 -:10526000217831EA000008BF84F8208001D084F85A -:105270002060DFF8B88015F0010F15D098F8001005 -:105280002B4A4908606A52F8211088470121294AAF -:1052900098F80030A06A52F82320904798F8000050 -:1052A00010F0010F0BD01FE015F0200F18BF0221E6 -:1052B000EDD115F0020F18BF0021E8D1EEE7DAF8C2 -:1052C0000000062200F10901A01C0CF0E9FB40B926 -:1052D000207ADAF800100978B0EBD11F08BF01205E -:1052E00000D0002084F82100284625E0380B00205B -:1052F0006015004000100040481500401C1100409F -:105300000000040408F50140008000400014004043 -:105310004016004010140040181100404481004025 -:10532000448500404085004004150040B90000203D -:10533000D022020008230200FFF743FE15F0020FFF -:1053400005D03D4898F8001050F82100804715F02E -:105350000C0F07D0394898F8001050F82110C5F309 -:10536000C000884715F0200F05D0354898F8001088 -:1053700050F82100804798F80000022805D105F078 -:105380006E00402806D101F0DDFB98F800000428EB -:1053900028BFFFDFA07A022818BFBDE8F88F207B66 -:1053A000002808BFBDE8F88FC7F84461022815D06F -:1053B000012818BFFFDFA16A2069884298BFFFDF7C -:1053C000D4F81000C9F80000606B1E4940F480005A -:1053D00060634FF480000860BDE8F88F2169A06A1F -:1053E0000844EFE7012804BF28207047022804BFC3 -:1053F0001820704700B5FFDF282000BD012804BF3A -:1054000041F6A4707047022804BF41F2883070470B -:1054100000B5FFDF41F6A47000BD012804BF41F2D2 -:10542000D4707047022804BF41F20400704700B5F1 -:10543000FFDF41F2D47000BDD8220200E822020052 -:10544000F822020004F5014010B53F480AF0F7FBCE -:1054500000213D480AF022FC01213B480AF0F2FB02 -:105460003A49002081F822004FF6FF7088843849BD -:105470000880488010BD704734498A8C824218BF2A -:105480007047002081F822004FF6FF708884704733 -:105490002D49016070472E49088070472B498A8C3E -:1054A000A2F57F43FF3B03D000210160084670470F -:1054B00091F822202549012A1ABF0160012000200D -:1054C0007047224901F1220091F82220012A04BFED -:1054D00000207047012202701D4800888884104611 -:1054E00070471B49488070471849194B8A8C5B8864 -:1054F0009A4206D191F82220002A1EBF01600120A5 -:105500007047002070471148114A818C528891429F -:1055100009D14FF6FF71818410F8221F19B10021C3 -:10552000017001207047002070470848084A818CAC -:105530005288914205D190F8220000281CBF00201B -:1055400070470120704700009A0B0020740B002068 -:10555000BA0000207047574A012340B1012818BF04 -:105560007047137008689060888890817047537006 -:105570000868C2F802008888D08070474D4A10B190 -:10558000012807D00EE0507860B1D2F80200086020 -:10559000D08804E0107828B19068086090898880ED -:1055A0000120704700207047424910B1012803D004 -:1055B00006E0487810B903E0087808B10120704788 -:1055C0000020704730B58DB00C4605460D2104A86B -:1055D0000CF02BFBE0788DF81F0020798DF81E0071 -:1055E00060798DF81D002868009068680190A868AF -:1055F0000290E868039068460BF0B2F920789DF8B5 -:105600002F1088420CD160789DF82E10884207D167 -:10561000A0789DF82D10884202BF01200DB030BD4A -:1056200000200DB030BD30B50C4605468DB04FF0B2 -:10563000030104F1030012B1FEF790FA01E0FEF756 -:10564000E0FA60790D2120F0C00040F04000607168 -:1056500004A80CF0EAFAE0788DF81F0020798DF8A4 -:105660001E0060798DF81D00286800906868019020 -:10567000A8680290E868039068460BF071F99DF8FD -:105680002F0020709DF82E0060709DF82D00A070F6 -:105690000DB030BD10B5002904464FF0060102D010 -:1056A000FEF75CFA01E0FEF7ACFA607920F0C0008A -:1056B000607110BDBE00002070B5FA4E044696F829 -:1056C00092000025012828D096F88C00012833D0BC -:1056D00096F86A0001281CBF002070BD6570132079 -:1056E0002070202206F16C01A01C0CF005FA0120AC -:1056F000A07186F86A50B6F86E10A6F88E10EA49C6 -:1057000049684A7B86F8902086F88C000888FBF769 -:10571000AFFAFAF71FFF012070BD657019202070E5 -:10572000D6F89300C4F80200D6F89700C4F8060033 -:1057300086F89250012070BD657006202070D6F862 -:105740008E00C4F8020086F88C50E4E7D54890F843 -:105750006A10002914BFB0F86E004FF6FF70704752 -:1057600070B5D14800250570017800291CBFFFDF06 -:1057700070BDCC4C84F8625084F8635084F8645057 -:1057800084F8655084F85E5084F8605084F8565070 -:1057900084F8365084F867507F21817094F8660051 -:1057A00028B1FFF7B2FBFEF706FE84F8665084F8D6 -:1057B0006A5084F88C5084F89250BC480AF0D6F8AD -:1057C000BDE87040BA480AF0D1B8B64890F8620017 -:1057D0007047B44900B591F8580091F85710C0F3DC -:1057E0008002C0F340031A4400F001001044052970 -:1057F00010D2DFE801F00B070B030900AD4931F8C7 -:10580000100000BDAC4800BDAC4900E0AC4931F827 -:10581000100000BDFFDF002000BDA24840F2712152 -:10582000B0F85A00484370479E4890F86800002836 -:1058300018BF0120704710B59A4C207A022818BF73 -:10584000032808D1207C04F1110108F071FF082819 -:105850001CBF012010BD207A002816BF022800209E -:105860000120BDE81040FFF79FBE8E4908727047C7 -:105870008C4981F8600070472DE9F041894C82B075 -:10588000207A002816BF022800200120607204F14F -:105890000A01FFF773FE207A022816BF03280121B0 -:1058A000002184F85F10082084F85D00607A0126EA -:1058B000002504F10A02012804BF527912F0C00F3A -:1058C0000AD004F10A02012804D1507900F0C00086 -:1058D000402801D0002000E0012084F85E0029B9B2 -:1058E00094F85700012818BF042806D1207C04F141 -:1058F000110108F01DFF84F85D002560FDF7B8F880 -:1059000060604FF0000894F85D0008F02DFF074636 -:1059100094F85F00002818BF002F04D010213846EB -:1059200009F093FD68B194F8600000281CBF94F85A -:105930005E0000281DD0607A04F10A0101280ED013 -:1059400012E06672424604F10A013846FFF76BFE28 -:1059500094F85D1004F10A0008F0FEFF09E04879B0 -:1059600000F0C000402840D0294604F10A00FFF7AB -:1059700091FE04F10A014D480AF01EF8617A4B4885 -:105980000AF03FF804F10A0149480AF015F8617A73 -:1059900047480AF036F894F8570001281EBF04283B -:1059A00002B0BDE8F081002594F85D0008F0E5FE46 -:1059B000040004BF02B0BDE8F081102109F045FDEC -:1059C00000281CBF02B0BDE8F0812A466946204687 -:1059D000FFF729FE6946354809F0FCFF01213348ED -:1059E0000AF01CF802B0BDE8F08108F0EEFF424674 -:1059F00004F10A01FFF717FEBBE770B5294C417BA4 -:105A000084F85810017984F8571001290CBF00223E -:105A10000288A4F85A20827B84F868208279002AC0 -:105A200016BF022A002201222274D0F80720C4F8EF -:105A30001120B0F80B00A4F8150094F856000125C9 -:105A4000002818BF84F8635094F83600002818BF67 -:105A500084F8645005293AD2DFE801F0030C1E34C3 -:105A60000C000021114809F084FF01210F4809F0C2 -:105A7000BFFF2DE001210D4809F07BFF04F111016A -:105A80000A4809F0A7FF217C084809F0C7FF012157 -:105A9000064809F0ADFF1BE00621044809F069FF44 -:105AA00016E00000BC0B0020CC000020580C0020A9 -:105AB000800C002028230200D0891300302302002C -:105AC000202302000221FE4809F053FF00E0FFDF1F -:105AD0000421FC4809F04DFF84F86250002070BD9D -:105AE00070B5F94C0546002084F864002A4604F19C -:105AF00017000CF001F884F83650012084F8640097 -:105B000070BD10B5F04C002284F8632084F8560074 -:105B1000024604F137000BF0EFFF012084F8630028 -:105B200010BDE94981F8670070472DE9F041E74E63 -:105B300082B0307808BBE44C94F86200E8B1FFF71B -:105B400043F9002584F8615075702846FFF739F94C -:105B5000FEF7ECFDFEF7C3FDDD48FEF788FEDD48ED -:105B6000FFF71BF994F85800002610F0010F08D039 -:105B70002520FEF784FE012612E002B00C20BDE8CD -:105B8000F08110F0020F04D02620FEF778FE0226E6 -:105B900006E010F0040F03D02720FEF770FE042665 -:105BA000FEF79DFD84F85C60FFF705F900210122F6 -:105BB0000846FEF78DFF0F210520FEF71DFE94F825 -:105BC0005E00002804BF94F85F00002805D194F817 -:105BD0005700012818BF042874D1FCF749FF064676 -:105BE00031466068FDF755FCBB4990FBF1F701FBBE -:105BF000170041423046FCF746FC6060206838449C -:105C0000206008F092FD2168884274D8C4E90056EB -:105C10004FF0010894F85D0008F0A6FD064694F8E0 -:105C20005F000127002818BF002E04D01021304645 -:105C300009F00BFC68B194F8600000281CBF94F8D0 -:105C40005E0000281DD0617A04F10A0001290ED0FF -:105C500012E03A46677204F10A013046FFF7E3FCAE -:105C600094F85D1004F10A0008F076FE09E040792E -:105C700000F0C00040281DD0414604F10A00FFF7A3 -:105C800009FD04F10A018E4809F096FE617A8C48FC -:105C900009F0B7FE04F10A018A4809F08DFE617A25 -:105CA000884809F0AEFE94F85700012818BF042870 -:105CB00021D108E008F089FE3A4604F10A01FFF715 -:105CC000B2FCDEE717E0012794F85D0008F055FD0F -:105CD000060010D0102109F0B8FB60B93A466946B9 -:105CE0003046FFF7A0FC6946754809F073FE0121B4 -:105CF000734809F093FE617A04F10A00FEF770FD23 -:105D000094F8570001281EBF042894F86300002867 -:105D100008D094F8562004F13701694809F09CFE38 -:105D200084F8635094F8640040B194F8362004F18C -:105D30001701644809F0BCFE84F8645008F069FD5E -:105D4000664808F0FAFD84F86600FFF745F802B0EF -:105D50000020BDE8F0815D494860704770B55A4C3D -:105D600006002BD094F8581094F85C20002521EA06 -:105D7000020010F0010F04D02520FEF780FD012560 -:105D800015E011F0020F02D012F0020F06D011F050 -:105D9000040F0CD012F0040F05D008E02620FEF707 -:105DA0006EFD022503E02720FEF769FD0425FEF7BE -:105DB00096FC94F85C00284384F85C0094F8610039 -:105DC00040B194F85700012808BFFFDFBDE87040DC -:105DD00000F0BFBA36B1002201234FF4967110468D -:105DE000FEF7BAFE3648FEF7FAFF94F8570005288A -:105DF00009D2DFE800F0030303090300012108468C -:105E0000FFF7BBF800E0FFDF94F8580094F85C104F -:105E100030EA01014FF0010002D02C49087070BD3A -:105E200094F85710012912BF84F86100002184F80A -:105E30005C10F2E710B5FEF7C7FF2448007840B9C0 -:105E4000214890F8620020B10020FFF787FF002072 -:105E500010BDFFF71BF8FFF70DF8FEF73FFFFEF749 -:105E6000A2FFFEF7B9FF0C2010BD184901204870B1 -:105E70007047154981F86500704770B5002503F03B -:105E8000A3FA48B1114E3078012809D0022801D078 -:105E9000032842D0FFDF70BDBDE8704000F059BA62 -:105EA000094C94F85700032837D094F8660018B1CD -:105EB000FEF76DFAFFF71CF80848FEF790FF0FE0B9 -:105EC000580C0020800C0020BC0B0020CC000020CF -:105ED0001B2302001823020040420F00A80C0020E0 -:105EE0009620FEF7A4FF94F85700012818BF042855 -:105EF0000AD094F86800012814BF0328102545F043 -:105F00000E010020FFF739F894F86700012808BF58 -:105F1000FFF710F80220307070BDBDE8704001201E -:105F20001CE770B5FE4DFF4C95F86700012817D0AF -:105F300095F8660018B1FEF7E8FFFEF73CFA03F0AB -:105F400043FAB8B12078022818BFFFDF0120FFF71D -:105F500005FF207800281EBF20780128FFDF70BDD4 -:105F6000F148FEF7F2FF002804BF7F20A070FEF783 -:105F7000D7FFDDE7BDE8704000F0EBB92DE9F05F39 -:105F800007464FF00009FEF76AFCE64E824630787D -:105F9000022818BFFFDFE24D7F2495F86700012833 -:105FA00030D0E24809F004FD83464FF0FF08002F8F -:105FB00000F0E480DD4809F00EFE002800F0DE80ED -:105FC000FEF716FC002800F0D98095F86600D74F40 -:105FD00068B108F003FC8046FF2808D00146F81C91 -:105FE00008F0EBFB404608F004FC40EA0A0A584679 -:105FF0004FF0000B062880F0C180DFE800F0BFBF43 -:10600000BF0CBF69C848FEF7A0FF002808BFB470E6 -:10601000FEF786FFC5E795F85700012818BF04284A -:1060200070D0BAF1000F18D195F86800002818BF99 -:10603000022867D13878F91CC0F3801008F078FB8B -:10604000824608F0DAFC40B1504608F096FB20B1D9 -:10605000102109F0FAF9002854D095F867000128BA -:1060600004BF95F89200002805D0B148FEF7B7FEAE -:106070000320307084E0012085F89200B8F1FF0F12 -:106080000FD005F19402511E404608F07FFB002816 -:1060900008BFFFDF95F8930040F0020085F89300F9 -:1060A0000CE03878C0F3801085F89300D5F8EF0045 -:1060B000C5F89400B5F8F300A5F89800B07805F19C -:1060C0009A077F2808BFFFDFB0783870B470CCE73C -:1060D0003878297CC0F38010884209D1062205F166 -:1060E0001101F81C0BF0DCFC002808BF012000D0D7 -:1060F0000020B8F1FF0F06D0C0B995F85D0040450B -:106100001AD113E03AE0B8B13878F91CC0F3801026 -:1061100008F00EFB044608F070FC38B1204608F089 -:106120002CFB18B1102109F090F928B195F857000F -:10613000012818BF04281DD095F85700F0B9BAF10E -:10614000000F17D195F86800002818BF012815D155 -:106150003878F91CC0F3801008F0EAFA044608F019 -:106160004CFC38B1204608F008FB18B1102109F0AA -:106170006CF918B195F865002C46D8B14FF00109BB -:1061800095F8660018B1FEF7C0FEFEF714F9B9F1F4 -:10619000000F1CBF0120FFF7E1FD307800281ABF77 -:1061A00030780128BDE8F09F3078032818BFFFDF62 -:1061B000BDE8F09F7068D4F8FB10C0F80E10B4F87A -:1061C000FF10418294F801110175B97D4175B7F84E -:1061D0001710C182B7F819104180B7F81B108180E1 -:1061E000B7F81D10C180534908300BF02AFE97F80C -:1061F000240000F01F017068017697F82410490907 -:1062000080F864113A78417BC2F340121140417327 -:1062100094F86A00002818BFFFDF84F86CB0D6F845 -:1062200004A0BAF80000A4F86E00BAF80200A4F8BE -:106230008400BAF80400A4F88600BAF80600A4F8AE -:1062400088009AF8640184F88A0094F85F0048B1E5 -:10625000607A04F10A01012804D1487900F0C000F5 -:10626000402835D094F8600040B1607A04F10A010A -:10627000012804BF487910F0C00F29D0C4F878B0C5 -:10628000A4F87CB03878B8F1FF0FC0F380108AF81A -:106290001900D4F8EF00CAF81A00B4F8F310AAF8FD -:1062A0001E101CD0C4F87E00BAF81E00A4F88200AC -:1062B00004F17202511E404608F068FA002808BF37 -:1062C000FFDF94F8710040F0020084F8710015E0DF -:1062D000D4F80A00A067E089A4F87C00D2E7164849 -:1062E0000BF0A6FD9AF8190084F87100DAF81A008C -:1062F000C4F87200BAF81E00A4F87600012084F8F1 -:106300006A0070680088FAF7B3FCFAF713F986F8A8 -:1063100000B0FEF7BBFDFEF7ADFDFEF7DFFC0DE0C4 -:10632000BC0B0020CC000020CE000020A80C0020D8 -:10633000800C0020C70C00203A0C0020FEF733FD33 -:10634000FEF74AFD012003F09CF919E7012203F052 -:1063500048BA70B5FEF79AFDFEF78CFDFEF7BEFC5D -:10636000FEF721FD1F4C002694F8660028B1FEF7C9 -:10637000CCFDFEF720F884F866601B4D2E70FEF70A -:106380002BFD94F85700012804D0BDE87040002090 -:1063900003F077B9022003F074F994F86A0000283A -:1063A00018BFFFDF6878002808BF70BD207C84F824 -:1063B0007100D4F81100C4F87200B4F81500A4F804 -:1063C00076003C2084F86C0068680188A4F86E10A0 -:1063D000012184F86A100088FAF74AFCFAF7AAF853 -:1063E0006E7070BDBC0B0020CC0000202DE9F04188 -:1063F000FF4F044600207978FE4D4FF00108064615 -:1064000011B1012923D007E095F85310002918BFD6 -:1064100087F8018000D0012079782B2211FB02F14E -:10642000294491F82820104318D02A22A01C293191 -:106430000BF062FB66700420207084F8028078788C -:106440002B2110FB01F0284480F8286023E095F808 -:106450002810002918BF7E70DDD1DDE795F87E0099 -:10646000E0B1D5F87F00C4F80200D5F88300C4F885 -:106470000600D5F88700C4F80A00D5F88B00C4F8E8 -:106480000E0095F88F00A07466701220207084F8BA -:10649000028085F87E600120BDE8F08195F8220039 -:1064A00001281ED0287801281CBF0020BDE8F081FB -:1064B0006670132020702022A91CA01C0BF01CFB6E -:1064C000A6712E70A888A884D5F89C00417B85F819 -:1064D000261085F822800088FAF7CAFBFAF73AF806 -:1064E000D9E7667006202070686AC4F8020085F853 -:1064F0002260D0E7BF480178002914BF80884FF69A -:10650000FF7070472DE9F041BA4C064694F8280018 -:10651000002818BFBDE8F081304609F049FA01466D -:1065200001250020072937D2DFE801F00A040736E9 -:106530003636090084F82A5009E0032000E00220E2 -:1065400084F82A0004F13301304609F09BFA84F8FC -:10655000320094F8AF0018B1FDF74DFF01281FD0AD -:10656000304609F057FA84F82B0004F12C0130462C -:1065700009F029FA9E4E04F1520730787F2808BFAF -:10658000FFDF307838707F20307084F82850BDE805 -:10659000F041032001F005BF84F83200BDE8F0812E -:1065A000FDF76CFF04F12C02511E08F0EFF80028F3 -:1065B00008BFFFDF94F82B1041F0020184F82B1084 -:1065C000D8E710B5002001F0F6FD8A4CA8B1FEF71F -:1065D000F2FB012200211046FEF7F1F904F1BC00A4 -:1065E000FEF7FDFBD4F8B400FEF7FCFB94F8A00026 -:1065F000032818BF02281FD022E0FEF747FCFEF751 -:1066000039FCFEF76BFBFEF7CEFB94F8AF0030B120 -:10661000FEF77BFCFDF7CFFE002084F8AF000120E1 -:1066200084F8B800022084F8B200FEF7D5FBBDE87C -:106630001040002001F0B5BE01210020FEF79DFCB6 -:10664000FEF778FC94F8AF0018B1FDF7A0FEFEF756 -:106650004FFC032084F8B20010BD66490028B1F851 -:10666000BA202CD0FF2A0BD24FF6FF7000EA42006E -:10667000A1F8BA00FF2888BFFF2001D9A1F8BA000D -:106680005B484268012A12BF002A0D224260D243B1 -:10669000C2EBC20303EB021291F8B930DB4303EB08 -:1066A000830CCCEB83131A444260900CB1F8BA20EF -:1066B000B0FBF2F302FB130081F8B9007047012A26 -:1066C000DED95008A1F8BA0008BF0120D8D1D5E71B -:1066D00070B5484C002584F8B250012684F8B260A9 -:1066E00094F8B20002281BBF94F8B20001280020E1 -:1066F000FFDF18BF70BD2B2101FB004181F828503E -:10670000401CC0B20228F6D3257084F8225094F8B9 -:10671000AF0028B1FEF7F9FBFDF74DFE84F8AF504E -:1067200084F8AE5084F89B60324884F8A05084F816 -:10673000B15040F2011120F8981F817070BD2DE911 -:10674000F0412C4C05460C2794F8B20001281FBFDD -:1067500094F8B20002280C20BDE8F081FEF734FB6B -:10676000FDF7E4FFFDF7BBFF94F898000126002831 -:1067700001BF94F89900002894F89A00002874D07A -:1067800094F8A000032802D0022805D008E00521D3 -:10679000194800F0DEFE03E00321174800F0D9FE9F -:1067A00094F8AC00002804BF94F8AD00002847D04E -:1067B000FCF75EF907463946D4F8A800FCF769FEF5 -:1067C0000E4990FBF1F801FB180041423846FBF7F7 -:1067D0005AFEC4F8A800D4F8A4004044C4F8A400A9 -:1067E00007F0A3FFD4F8A410884229D8002007E0BE -:1067F000D4000020D00C0020B40D002040420F0037 -:10680000C4E9290794F8AD0000281CBF012008F056 -:10681000AFF8012194F8AE0000281CBF94F8AC003A -:1068200000280DD094F8910004F19202012804D1BF -:10683000507900F0C00040280ED01046FEF72AFF25 -:1068400094F8911004F19200FDF7CAFF94F8B20099 -:106850000027012818D112E008F0B7F8324604F1F9 -:106860009201FEF7E0FEEBE7FFE794F8B2000228A2 -:1068700004BF84F8B2600C2006D1BDE8F08184F832 -:10688000B860022084F8B20094F89B0080B108F050 -:1068900018F8FE4808F051F884F8AF00FC48C4F836 -:1068A000B450FEF77AFAFEF797FA3846BDE8F08161 -:1068B00007F0AFFFEDE770B5FEF786FAF54C94F8F8 -:1068C000B200022803D0FEF787FA0C2070BD012029 -:1068D00084F8B900A4F8BA000220FEF772FAEE4874 -:1068E000FDF7C5FFED4B002004F1980294F8B110BC -:1068F000491CA3FB015C4FEA5C0CACEB8C0C6144C3 -:10690000C9B284F8B110895C012907D0401CC0B21B -:106910000328EBD3FFF755FE002070BD94F8B100BB -:10692000DF49085CFDF7ABFFFDF7D9FEF2E710B5D4 -:10693000D84C94F89030022B14BF032B00280BD1B5 -:1069400000291ABF022901200020114607F0F0FE9D -:1069500008281CBF012010BD94F89000002816BF25 -:10696000022800200120BDE81040FEF71DBEC948E6 -:1069700090F89000002816BF022800200120FEF7A2 -:1069800013BEC44981F890007047C24981F8AE0037 -:10699000704770B5BF4C94F89000002816BF0228CD -:1069A0000020012084F8910004F19201FEF7E6FD39 -:1069B00094F89000022816BF03280121002184F8D2 -:1069C000AD1094F89100002504F19202012804BF53 -:1069D000527912F0C00F0AD004F19202012804D1BA -:1069E000507900F0C000402801D0002000E00120D4 -:1069F00084F8AC00002804BF002970BDC4F8A4507E -:106A0000FCF736F8C4F8A80094F8AD0000281CBFC5 -:106A1000002007F0ADFF002694F8AE0000281ABF52 -:106A200094F8AC00002870BD94F8910004F1920134 -:106A3000012804D1487900F0C000402806D029463A -:106A400004F19200BDE87040FEF724BE07F0BDFFE0 -:106A5000324604F19201BDE87040FEF7E4BD002823 -:106A600016BF0228012200228A4981F89B2081F862 -:106A7000A100704770B5874D0C4600280CBF01215E -:106A8000002185F89B1085F8A2004FF0080085F8DA -:106A9000A3000BD1002C1ABF022C012000201146AC -:106AA00007F046FE85F8A300082801D0002070BD3D -:106AB000022C14BF032C1220F8D170BD754A032894 -:106AC00008BFC2F89C1082F8A000002070477149EE -:106AD00091F8A000032804D0012818BF022807D08D -:106AE00004E091F8A200012808BF70470020704719 -:106AF00091F8A100012814BF03280120F6D17047A6 -:106B000010B5FEF7C3F9FEF7B5F9FEF7E7F8FEF7A3 -:106B10004AF9604C94F8AF0030B1FEF7F6F9FDF792 -:106B20004AFC002084F8AF00012084F8B80002205D -:106B300084F8B200FEF750F9002010BD554981F8E5 -:106B4000B300704710B5FEF7A1F9FEF793F9FEF711 -:106B5000C5F8FEF728F94F4C94F8AF0030B1FEF7B6 -:106B6000D4F9FDF728FC002084F8AF00012084F858 -:106B7000B800022084F8B200FEF72EF9BDE81040FC -:106B8000002001F00EBC2DE9F84F424CFF217F2779 -:106B9000444E84F8B0104FF00008002800F0DC826A -:106BA00004F1BC0008F0E7FF30B904F1BC0009F0C3 -:106BB00002F8002800F0D08294F8B200334D052886 -:106BC00080F0C782DFE800F0F1F1F103F0002F4818 -:106BD00008F0EEFEB07094F89B0030B9FDF73FFE70 -:106BE000002808BF4FF0000801D04FF0010894F8CA -:106BF000AF0078B107F0F2FD84F8B0000146FF283D -:106C00000CD0E81C07F0D9FD94F8B00007F0F1FDB6 -:106C100040EA080894F8B000FF2812D107F081FE7E -:106C200084F8B00094F89B1059B1082809D128784D -:106C3000E91CC0F3801007F07BFD082818BF4FF057 -:106C40000008B078072880F0C781DFE800F04BB873 -:106C500004FCFCFC300094F8AF0018B1FEF755F9C5 -:106C6000FDF7A9FB0F48FEF770F9002808BF377041 -:106C7000FEF756F9B8F1000F00F0598194F8A00022 -:106C8000012818BF022840F052810DE08C0D002031 -:106C900038230200D00C00203E230200ABAAAAAA8F -:106CA0003B230200D4000020FEF718F868E094F8B7 -:106CB000AF0018B1FEF729F9FDF77DFBFE48FEF79E -:106CC00044F9002808BF3770FEF72AF9B8F1000F21 -:106CD00000F02D8194F8A00002284AD001284FD05E -:106CE00000F025B994F8AF0018B1FEF70EF9FDF7E2 -:106CF00062FBF148FEF729F9002808BF3770FEF75C -:106D00000FF9B8F1000F00F0128194F8A0000228EA -:106D10002FD0012834D003281CBFFFDFBDE8F88F37 -:106D2000E978D4F89C00827E91421BD12979C27EF9 -:106D3000914217D16979027F914213D1A979427F9B -:106D400091420FD1E979827F91420BD1297AC27F9A -:106D5000914207D12978427EC1F38011914208BF48 -:106D6000012100D0002194F8A220012A0ED0E9B11F -:106D7000D9E0D248FFF7C6FBBDE8F84F00F002BBF0 -:106D8000CE48FFF7BFFBBDE8F84F1AE4002974D1E5 -:106D900000F11A01C94808F016FEC84808F03AFE8A -:106DA000D4F89C104876BEE024E1D2E194F8A30028 -:106DB00008287DD094F8B01081425ED0B7E094F8F6 -:106DC000AF0018B1FEF7A1F8FDF7F5FABA48FEF7E3 -:106DD000BCF8002808BF3770FEF7A2F894F8AD00A1 -:106DE00000280CBF4FF0010B4FF0000B4FF00009D3 -:106DF0002878C10905F1090007D0407900F0C000EA -:106E0000402808BF4FF0010A01D04FF0000A94F863 -:106E1000A000032806D194F89B00002818BF94F81E -:106E2000A30001D194F8B00007F09EFC009088B157 -:106E3000102108F00AFB002818BF4FF0010BBAF12F -:106E4000000F07D000E0C7E005F109010098FEF748 -:106E5000B9FB814694F8A00003280FD0FDF73EFF50 -:106E6000B8F1000F69D0FDF7C3FC50EA090064D007 -:106E70009248FFF747FB00F041B954E0D4F89C007A -:106E8000E978827E91421DD12979C27E914219D141 -:106E90006979027F914215D1A979427F914211D13E -:106EA000E979827F91420DD1297AC27F914200E037 -:106EB0003DE007D12978407EC1F38011814208BFAF -:106EC000012500D0002594F8B000082805D094F8DA -:106ED000A310884208BF012600D00026B9F1000F98 -:106EE00005D1BBF1000F04D0FDF782FC08B10121F0 -:106EF00000E00021B8F1000F09D094F8A2000128A9 -:106F000003D020B955EA060001D0012000E000209E -:106F100001420CD094F8A200012804BF002DD4F83F -:106F20009C003FF435AFBDE8F84F00F08ABAFDF79A -:106F3000D5FEBDE8F84FFFF744BB94F8A100032845 -:106F400018BF02287ED1BAF1000F7BD0B9F1000F33 -:106F500078D1DFF8688194F87E00002872D101258D -:106F600084F8805094F8AF0018B1FDF744FA012876 -:106F700021D0404608F04EFD84F8810004F18201E2 -:106F8000404608F020FD404608F051FD84F8880096 -:106F900004F18901404608F024FD307804F18F089F -:106FA0007F2808BFFFDF307888F80000377084F84A -:106FB0007E500320A0E0FDF761FA04F18202511E29 -:106FC00007F0E4FB002808BFFFDF94F8810040F0E1 -:106FD000020084F88100D6E794F8AF0018B1FDF7FD -:106FE00094FFFDF7E8F93448FDF7AFFF00286CD1B6 -:106FF0003770CAE0314808F0DBFCB0703048E978FF -:10700000427A91421CD12979827A914218D16979C8 -:10701000C27A914214D1A979027B914210D1E979C7 -:10702000427B91420CD1297A827B914208D1297806 -:107030000078C1F38011B1EBD01F08BF012500D04B -:10704000002500E042E0FDF749FEB07804286BD14E -:10705000D5B31948FDF779FF002808BF3770FDF751 -:107060005FFF94F8B80000281CBF0020FFF7F5FA76 -:107070004FF0010884F8B880104D94F8530028BBF5 -:10708000042084F8550094F8AF00A5F1910918B1D7 -:10709000FDF7B1F9012835D0284608F0BBFC0949B5 -:1070A00081F8560009F12C01284608F08CFC00BF3D -:1070B00004F15E0128460AE0D40000208C0D002077 -:1070C000B40D0020D00C00202EE05EE016E008F0A9 -:1070D00005FD84F85D001F2884BF1F2084F85D0033 -:1070E00004F17D0530787F2808BFFFDF30782870F5 -:1070F000377084F85380042001F053F9BDE8F84F4D -:10710000FFF75FBAFDF7BAF909F12C02511E07F03B -:107110003DFB002808BFFFDFFE4890F8560040F016 -:10712000020089F82B00C3E7FB48FDF70EFF00289B -:1071300008BF3770FDF7F4FE94F8B800002804BFCC -:107140000120FFF78AFA84F8B880BDE8F84FFFF70E -:1071500038BAFFDFBDE8F88F94F8B200052828BFE1 -:10716000BDE8F88FDFE800F0030303041900F1E73E -:1071700094F8AF0018B1FDF7C8FEFDF71CF9E6481A -:10718000FDF7E3FE00283FF433AFFDF7C9FEFDF73E -:10719000A5FDBDE8F84FFFF714BADF48FDF7D5FEAF -:1071A000002808BF3770FDF7BBFE94F8B800002830 -:1071B00004BF0120FFF751FA84F8B880FDF78EFD77 -:1071C000BDE8F84FFFF7FDB970B5D24C94F8B200A6 -:1071D000072878D2DFE800F08D8D8D8D8D041000AA -:1071E000CE48FDF7FCFDFDF7A5FE9620FDF71FFE3E -:1071F000042084F8B20070BDFDF748FEFDF73AFEAA -:10720000FDF76CFDFDF7CFFD012584F8B850022095 -:1072100084F8B200FDF7E0FD2078002818BFFFDFFA -:107220000026A670D4F89C000188A1804188618363 -:107230008188A183C088E08384F8206094F8AD1031 -:10724000B74849B10178C21CC1F3801121B151790D -:1072500001F0C00140292ED094F8AE1041B110F8D1 -:10726000031BC1F3801119B1407910F0C00F22D077 -:10727000AC480AF0DDFD00BF94F8AF0018B1FDF78F -:10728000BAF8012820D0D4F89C00417EE171D0F8F2 -:107290001A10A160C08BA081666126832570D4F886 -:1072A0009C000088F9F7E4FCF9F744F9BDE8704068 -:1072B000022001F076B8D4F8E700C4F80E00B4F864 -:1072C000EB006082D8E714E0FDF7D8F804F108027B -:1072D000E11D07F05BFA002808BFFFDFE07940F00E -:1072E0000200E071D4F8BF006061B4F8C3002083ED -:1072F000D4E7FFDF70BD70B5864C94F8B20000256E -:10730000052828BF70BDDFE800F03939391B0300BC -:107310008148FDF71AFE10B97F497F200870FDF7FC -:10732000FFFD94F8B800002804BF0120FFF795F98D -:1073300084F8B850FDF7D2FCBDE87040FFF741B9C2 -:10734000FDF7A4FDFDF796FDFDF7C8FCFDF72BFD4D -:1073500094F8AF0028B1FDF7D8FDFDF72CF884F8BC -:10736000AF50012084F8B800022084F8B200FDF785 -:1073700033FDBDE87040002001F013B870BD01225C -:1073800001F0E1B870B5012000F015FF614CC8B103 -:1073900004F1E401A1F1280008F04CFB04F1E4063B -:1073A00094F89110304608F02CFB04F1920130461D -:1073B00008F002FB94F8AD00C0B394F8A0000328D5 -:1073C0001FD025E0FDF762FDFDF754FDFDF786FCBB -:1073D000FDF7E9FC94F8AF0030B1FDF796FDFCF73E -:1073E000EAFF002084F8AF00012084F8B8000220F2 -:1073F00084F8B200FDF7F0FCBDE87040002000F01A -:10740000D0BF94F89B00002818BF94F8A30001D1C6 -:1074100094F8B00007F0DBFA050007D001213046F0 -:1074200008F0EFFA2946304608F0C6FA3C48FDF766 -:10743000D6FC01210846FDF7A0FD052084F8B20026 -:1074400070BD70B5022000F0B6FE324C68B301206A -:1074500000F0A7FF04F1E401A1F1280008F0EAFA26 -:10746000D4F89C00417B04F1E40008F0C1FAD4F8A0 -:107470009C0004F1BC0204F1E4061278417BC2F3E3 -:1074800040121140417394F89110304608F0B9FA57 -:1074900004F19201304608F08FFA94F8AD00B8B3C9 -:1074A00094F8A00003281FD025E0FDF7EFFCFDF7BE -:1074B000E1FCFDF713FCFDF776FC94F8AF0030B16A -:1074C000FDF723FDFCF777FF002084F8AF000120D3 -:1074D00084F8B800022084F8B200FDF77DFCBDE816 -:1074E0007040002000F05DBF94F89B00002818BF9A -:1074F00094F8A30001D194F8B00007F068FA0500F1 -:1075000014D00121304608F07CFA294630460BE0C1 -:107510000CE00000D00C0020D40000208C0D0020D6 -:10752000B40D0020DE0C002008F046FAD4F89C00D0 -:10753000C18A324808F0FEFAD4F89C00417D2F48F9 -:1075400008F0FCFA2D48FDF74AFC062084F8B2004A -:1075500070BD70B50C46054608F008FA032C47D0FC -:10756000052C18BF70BD0521284608F002FA244CEE -:10757000D4F89C0000F10E01284608F0C5FAD4F8B2 -:107580009C0000F11201284608F0C2FAD4F89C00D1 -:10759000417D284608F0D2FAD4F89C00C18A2846DA -:1075A00008F0C8FAD4F89C004188284608F0B6FADA -:1075B000D4F89C008188284608F0B4FAD4F89C00DE -:1075C000C188284608F0B2FAD4F89C0000F10801FE -:1075D000284608F0CDFAD4F89C00017E284608F031 -:1075E000AFFA94F8B3102846BDE8704008F0B2BA7C -:1075F0002846BDE87040032108F0BBB9B40D002057 -:10760000D00C00202DE9FF4F06460C46488881B07B -:1076100040F2E24148430090E08A002500FB01FB74 -:1076200094F8630091460D2818BF0C281ED0252819 -:107630001EBF94F8640025284FF0000A16D0049865 -:1076400018B10121204603F029FB94F8510094F869 -:10765000528094F8C810074659B1012958D0022920 -:107660003DD0032918BFFFDF52D0A6E04FF0010A3A -:10767000E5E7B9F1000F08BFFFDFFE4D686800289D -:1076800008BFFFDF94F85100FDF7C7FE00F2E731B5 -:107690004FF47A70B1FBF0F0696800EB010994F8DF -:1076A0005100FDF7BAFE94F85110022907BFF249C4 -:1076B0004FF47A72F1494FF4C8621144084400F261 -:1076C000E7314FF47A70B1FBF0F040F2E241081A72 -:1076D0002969584449440844051D012015E0E5483E -:1076E000A9F101014068084308BFFFDFE448B9F190 -:1076F000000F006800EB0B0506D0DE48406800F282 -:107700002230A84288BFFFDF032084F8C80053E07E -:1077100094F86310009D25291CBF94F86410252956 -:1077200036D1B4F85810B4F8EA20891A491C09B2C5 -:1077300000292DDB94F8E81009B30F4694F8E910FE -:10774000002918BF8846022807BFCB484FF47A713A -:10775000CA484FF4C8610144022F07BFC6484FF41E -:107760007A72C6484FF4C8621044814208D9081A98 -:1077700000F5FA714FF47A70B1FBF0F0054407E0C0 -:10778000401A00F5FA714FF47A70B1FBF0F02D1A3F -:10779000B9F1000F10D0DFF8DC92D9F8040020B95D -:1077A000B9F80200002818BFFFDFD9F8040000F282 -:1077B0002230A84288BFFFDF05B9FFDF2946D4F891 -:1077C000CC00FAF760FEC4F8CC00B0600020307046 -:1077D0004FF0010986F80490204603F04CFBAAF113 -:1077E0000101084208BF86F8059006D094F8C80049 -:1077F00001280CBF0220032070714046D4F824B049 -:10780000FDF7FCFD0146022F07BF9B484FF47A723B -:107810009A484FF4C8621044084400F23F614FF4A4 -:107820007A70B1FBF0F0584400F5C970F06004982C -:1078300030EA0A0004BF05B0BDE8F08F29463046A3 -:1078400007F010FF87B2204603F015FBB8420FD8AF -:10785000074686F8059005FB07F1D4F8CC00FAF747 -:1078600012FEB0602946304607F0FCFE384487B26D -:107870003946204603F012FAB068C4F8CC0005B0CF -:10788000BDE8F08F2DE9F04304467E4885B00D46F3 -:1078900090F80004DFF8F091400999F800144909C4 -:1078A000884218BFFFDFDFF8CC81002708F13C06D3 -:1078B000082D80F0FA80DFE805F0045B656560F86C -:1078C000F894202C28BFFFDF36F814000621F9F7C2 -:1078D000C5F8050008BFFFDF202C28BFFFDF36F802 -:1078E00014002988884218BFFFDF95F8C8000028D7 -:1078F00008BFFFDF284602F0BCFEC8F80470A8F8F5 -:10790000027029460020C8F8107007F0EFFE00F161 -:107910009804686AA04218D995F85200FDF76EFDE8 -:1079200095F85110022907BF53494FF47A72534911 -:107930004FF4C862114408444FF47A7100F23F607A -:10794000B0FBF1F1686A0844071B29460020C8F81B -:10795000087007F0CBFE698840F2E242514398304C -:10796000081AA0F22230C8F80C0005B0BDE8F08378 -:1079700005B0BDE8F04303F05DB805B0BDE8F043E5 -:10798000FDF792BB99F8140D4049400991F8001495 -:107990004909884218BFFFDF202C28BFFFDF36F8D7 -:1079A00014000621F9F75AF8050008BFFFDF202C64 -:1079B00028BFFFDF36F814002988884218BFFFDF90 -:1079C0000022012329466846FFF71CFE95F8D200E5 -:1079D0006946FBF797FA002808BFFFDF05B0BDE84E -:1079E000F083202C28BFFFDF36F814000621F9F7BA -:1079F00035F8050008BFFFDF202C28BFFFDF36F871 -:107A000014002988884218BFFFDF95F8C8000428B1 -:107A100018BFFFDF85F8C87095F8D2404FF6FF79A0 -:107A2000202C28BFFFDF26F8149095F8D200FBF732 -:107A300000F8002808BFFFDF202085F8D200D5F825 -:107A4000D800002804BFD5F8D400C8F8140008D026 -:107A5000D5E937121144826911448161D5E93501B4 -:107A6000C860D5F8D40000281CBFD5F8D810016133 -:107A700014D10EE0DC0D002068360200A2240200C2 -:107A8000E000002001E000E00BE000E019E000E091 -:107A90000BE0D5F8D800002818BF8761FC480078B3 -:107AA00005B0BDE8F043F4F725B9FFDF05B0BDE848 -:107AB000F0832DE9F047F74D0746E88B6C68401CD2 -:107AC000E88328784FF00008002808BFFFDF07D0C0 -:107AD000DFF8C4A3042814D0052818BFFFDF40D066 -:107AE00021462869FAF7CFFCB86087F800800120AA -:107AF0003871A86800F5B370F860287804287CD144 -:107B000085E00029ECD02E69DAF8141039B38946E3 -:107B1000C9680029FBD1B9F1000F20D099F8000005 -:107B2000002808BFFFDFD9F81410D9F80400014479 -:107B30003046FBF7AEFC002807DA211A4A1E92FBFA -:107B4000F4F202FB0406214604E090FBF4F202FB8F -:107B5000140621468E4288BFFFDF3446C0E7444604 -:107B6000BEE70029BCD0D5F81890B9F1000F08BFC6 -:107B7000FFDF0026D9F8DC10DAF814403046721E18 -:107B80005CB1A069884228BF824284BF0246264673 -:107B90002046E468002CF4D106B9064609F1C80471 -:107BA000C9F8D860002E04BFC4F80C80CAF814408D -:107BB00005D0F068F460E060002818BF0461D4F8D4 -:107BC0001090C4F81880B9F1000F0ED0D9F8180041 -:107BD00048B1D4F814A0504538BFFFDFD9F81800D9 -:107BE000A0EB0A00A061C9F81880002E08BFC5F8F4 -:107BF000208009D03078002800E00DE008BFFFDFCA -:107C0000716970680844286240F6B83468E7E88B08 -:107C10000A2838BF032000D302207871E88B01289E -:107C200006D93846696807F01DFDE98B0844E883EA -:107C3000B8682861BDE8F0872DE9F0418046974893 -:107C400084B00E4690F80004954F410997F800045F -:107C50004009814218BFFFDF01210025082E8D4C0D -:107C600062D2DFE806F0041A35353061614D617388 -:107C70002173607800281CBF04B0BDE8F0818648FD -:107C8000456005612573A068C138FEF758FD0028DE -:107C900018BFFFDF04B0BDE8F081607850B1207BF1 -:107CA000002808BFFEF72CFF657304B0BDE8F04163 -:107CB000FAF7E9BDA173FEF7FEFD002818BFFFDF4C -:107CC00004B0BDE8F08104B0BDE8F041FDF7ECB9C7 -:107CD00097F8140D7349400991F800144909884236 -:107CE00018BFFFDF00216846FFF7E3FE6946404604 -:107CF000FBF708F9002808BFFFDF04B0BDE8F081FA -:107D00002078052818BFFFDF207F002808BFFFDF8D -:107D100025772570207DFAF78CFE002808BFFFDF4D -:107D2000257504B0BDE8F081FFDF04B0BDE8F08147 -:107D30002DE9F041574C0026207804281FBF2078F9 -:107D400005280C20BDE8F08101206070607B0025D3 -:107D5000A8B1EFF3108010F0010F72B60CBF00272E -:107D60000127607B00281CBFA07B002805D0FEF700 -:107D7000C7FE6573A573FAF786FD2FB903E0207D72 -:107D8000FBF7D3F900E062B6207DFBF71CFC207FF7 -:107D900028B125772078052818BFFFDF0C266570ED -:107DA0002570207DFAF745FE002808BFFFDF257506 -:107DB0003046BDE8F0812DE9F04F364883B00078B9 -:107DC000002818BFFFF7B4FF0120DFF8CC8088F847 -:107DD000000069460620F8F7CCFD002818BFFFDF39 -:107DE00000274FF6FF7934E0029800281CBF90F876 -:107DF000C81000292DD0008848451CBFDFF8A8A076 -:107E00004FF0200B3BD00621F8F728FE040008BFF6 -:107E1000FFDF94F8D200FBF7D6FB84F8C87094F823 -:107E2000D2504FF6FF76202D28BFFFDF2AF81560CD -:107E300094F8D200FAF7FDFD002808BFFFDF84F8B0 -:107E4000D2B069460620F8F794FD002818BFFFDF7E -:107E500010E06846F8F76BFD0028C5D00FE00298E7 -:107E600000281CBF90F8C810002903D0008848459E -:107E7000C9D104E06846F8F75AFD0028EFD088F829 -:107E80000070C8F8147003B00020BDE8F08F000047 -:107E9000DC000020F40D0020DC0D002001E000E0FB -:107EA0000BE000E019E000E0180E002010B50078AB -:107EB000F84C60B101280CBF40F6C410FFDF06D0BB -:107EC000A06841F66A01884228BFFFDF10BDA060AC -:107ED000F6E710B5EF4C00232070EF4803704370B5 -:107EE000037703734373837320218361017518380B -:107EF00043703A3010214FF6FF72428020F8042F71 -:107F0000491EFAD1180008BFA36005D0002B0EBF90 -:107F1000FFDF40F6C410A060A06841F66A01884205 -:107F200028BFFFDFBDE8104045E72DE9F043DA4CFC -:107F3000054685B0207816460F4600281EBF0C2047 -:107F400005B0BDE8F08395F8519095F85200D5F84A -:107F50002480FDF753FAB9F1020F07BFCF494FF460 -:107F60007A72CF494FF4C862114408444FF47A79C9 -:107F700000F23F60B0FBF9F0404400F22230C5F857 -:107F8000DC00A56195F8C800002818BFFFDF40F2AB -:107F90007120784360600120FDF730FA00F2E7308D -:107FA000B0FBF9F040F2712106FB0100A0606168AE -:107FB000A1F2F621884298BF01460020A160B9498C -:107FC00008610521217060702077E083B648FAF7D8 -:107FD000D5FC2075202808BFFFDFFAF749FD206196 -:107FE00001216846FFF765FD207D6946FAF78AFFA3 -:107FF000002808BFFFDF002005B0BDE8F083A648D9 -:10800000007800281CBF0020704710B50620F8F744 -:10801000C1FC80F0010010BD30B59F4C85B02278C6 -:10802000002A1EBF0C2005B030BD0D4640F2712164 -:10803000484360600120FDF7E1F94FF47A7100F2E6 -:10804000E730B0FBF1F040F2712105FB0100A060C8 -:108050006168A1F2F621884298BF01460020A16024 -:10806000607004212170E0838F48FAF787FC207547 -:10807000202808BFFFDF8B48406938B10146C0683F -:108080000028FBD111B1FAF7F3FC05E0FAF7F0FC98 -:1080900040F6B831FAF7F7F9206101216846FFF799 -:1080A00008FD207D6946FAF72DFF002808BFFFDF95 -:1080B000002005B030BD70B5774CA1690160FFF7B5 -:1080C00037FE002300BBA169D1F8D8205AB1D1E90D -:1080D00037C5AC449569AC44C2F818C0D1E9352C19 -:1080E000CCF80C2005E0DFF8BCC1D1F8D420CCF8E6 -:1080F0001420D1F8D420D1F8D810002A18BF11616B -:1081000002D1002918BF8B61A36170BD6549487019 -:10811000704770B540F2E24300FB03F510460C4691 -:10812000FDF76CF9022C07BF5C494FF47A725C4989 -:108130004FF4C862114408444FF47A7100F23F6072 -:10814000B0FBF1F000F2223085428CBF281A0020EB -:1081500070BD70B50D4606460146002007F0C6FA10 -:10816000044696F85200FDF749F996F85110022995 -:1081700007BF4A494FF47A7249494FF4C862114423 -:1081800008444FF47A7100F23F60B0FBF1F071885F -:1081900040F271225143C0EB4100A0F22230A542CF -:1081A00034BF21462946814203D2A5422CBF28462E -:1081B0002046706270BD3B4910B54968002801F146 -:1081C000980408BF04F5BC7409D0012808BF04F561 -:1081D000317404D0022814BFFFDF04F5B0742E48B8 -:1081E0008068A0428CBF0120002010BD10B52D4C2E -:1081F000607828B1D4E90201626807F05BFAA060F8 -:10820000D4E9010188429CBF2078002814BF0020D7 -:10821000012010BD04222DE9F043204FDFF88080BB -:1082200085B04FF47A79052980F0B980DFE801F054 -:108230000A2B033E890080F8C82005B0BDE8F04352 -:10824000FAF721BB044617480078002818BF84F8C5 -:10825000C82004D005B0BDE8F043FAF714BB0122F2 -:10826000002321466846FFF7CDF994F8D20069460D -:10827000FAF748FE002808BFFFDFB4F85800401C9A -:10828000A4F85800E6E7032180F8C81005B0BDE85F -:10829000F0830000DC000020F40D002068360200AE -:1082A000A2240200DC0D0020397C01000446408835 -:1082B00040F2E2414843B3490860D4F8F000214657 -:1082C0000089E082D4F8F00080796075D4F8F0007D -:1082D00040896080D4F8F0008089A080D4F8F00054 -:1082E000C089E0800020A66A07F000FA054694F8ED -:1082F0005200FDF783F894F8511002290EBF4FF495 -:108300007A7147464FF4C8613944084400F23F602F -:10831000B0FBF9F1608840F271225043C1EB40009C -:10832000A0F22230AE4234BF29463146814203D208 -:10833000AE422CBF304628466062022084F8C80056 -:10834000A4E706460146856A002007F0CFF90446F7 -:1083500096F85200FDF752F896F8511002290EBF18 -:108360004FF47A7147464FF4C8613944084400F22B -:108370003F60B0FBF9F0718840F271225143C0EBCD -:108380004100A0F22230A54234BF21462946814255 -:1083900003D2A5422CBF28462046706276E7FFDF55 -:1083A00074E72DE9F041DFF8E0810025774C98F87B -:1083B000001084B0052880F0C180DFE800F00316CB -:1083C0006DB9B900E5830846F3F794FC607800289E -:1083D00073D100216846FFF76CFB207D6946FAF7F0 -:1083E00091FD002808BFFFDF67E00120FDF706F8D8 -:1083F0006749684E08444FF47A71B0FBF1F0216987 -:10840000726840F2E2431144081AA16900F2DE608A -:108410004A88C83102FB03F772698A4208BF002507 -:1084200014D0216AFBF735F8002807DA391A4A1EFA -:1084300092FBF7F202FB0705394604E090FBF7F2E6 -:1084400002FB170539468D4288BFFFDFD8F80800C8 -:10845000854208D2A06940F271224188C1824A4314 -:1084600005EB420505E040F2E240B5FBF0F0A16902 -:10847000C882A06905214175C08A6FF41C71484308 -:1084800005EB400040F635413061B0EB410F28BFAD -:10849000FFDF04B0BDE8F081E5830846F3F72AFC6E -:1084A00001202077A0692169C0F8CC1080F8C8505D -:1084B0002178052918BFFFDF06D0FAF7E4F96573C4 -:1084C000A57304B0BDE8F081002808BFFFDFA069F4 -:1084D00090F8C800002818BFFFDFA06990F8D2000C -:1084E000202818BFFFDF2C48FAF748FAA169064692 -:1084F000202881F8D2000F8828BFFFDF274820F806 -:108500001670A06990F8D200202808BFFFDF002372 -:1085100001226846A169FFF775F8A069694690F8DD -:10852000D200FAF7EFFC002808BFFFDFA561C4E71F -:1085300004B00846BDE8F041F3F7DCBBFFDF04B050 -:10854000BDE8F081704770B5124D0446002912BF96 -:108550000129686070BD02291CBFFFDF70BD6888FB -:10856000401C68801046FCF758FF4FF47A7100F207 -:10857000E730B0FBF1F0201A686070BD0348007866 -:1085800070470000E0000020DC000020F40D002017 -:10859000C92E0200DC0D002085780100180E002095 -:1085A000FE48406870472DE9F0410D4606460146F9 -:1085B0001746012007F09AF8044696F85200FCF797 -:1085C0001DFF96F8521002290CBFF549F5490844E1 -:1085D0004FF47A7100F2E140B0FBF1F0718840F2A3 -:1085E00071225143C0EB4100C01BA0F55970A54258 -:1085F00034BF21462946814203D2A5422CBF2846DA -:1086000020467062BDE8F0812DE9FF4F8FB004462F -:1086100090F85200DDF8709098460B9049EA0800F7 -:108620000C9094F86400002617460D280CBF01201A -:1086300000200890B8F1000F04BF94F8040103284B -:1086400071D1089800286ED0B4F87C01B8426AD184 -:10865000D4F80C01C4F8F800608840F2E2414843C5 -:10866000C4F8FC00B4F85201B4F8DE100844C4F8B1 -:108670000001204604F00DFDB4F88001E08294F87A -:108680007E016075B4F882016080B4F88401A08036 -:10869000B4F88601C549E080C348097894F864318C -:1086A000628830F8111030F81300D4F828A008447C -:1086B0000004000C4FF0000105D000FB02F1BC48A3 -:1086C000B1FBF0F0411C1FFA81FB2146012007F0AD -:1086D0000DF8054694F85200FCF790FE94F85210FD -:1086E00002290CBFAE49AF49084400F2E1414FF402 -:1086F0007A70B1FBF0F1608840F271225043C1EB17 -:108700004000A0EB0B00A0F55970AA4534BF2946E4 -:108710005146814203D2AA452CBF5046284660628A -:10872000022084F80401D4E956ABB4F8DE000390CB -:10873000B4F85001D4F84C110691B8F1000F03D0F1 -:1087400094F8181149B17FE004F1D8010091743117 -:10875000099104F59C75091D07E004F596710091D7 -:10876000091D099104F58E75091D0A91B4F8581078 -:10877000381A791A09B200B20491002805DAD4F83F -:108780004801069001200C90084694F80411002935 -:108790005ED0012900F0668102297DD0032918BF2F -:1087A000FFDF00F0A98131460698F9F76CFE0999C0 -:1087B00008600A9801210780002028702971099813 -:1087C0000068A8607948D0E90520824287BF009AF6 -:1087D0001060009802600098626A0068104400F21D -:1087E0008310E8606971B4F8C800C01B00B20028AB -:1087F000C4BF032068710898002800F0F181B9F126 -:10880000000F18D0B4F8F020002A0CBF0020B4F8F4 -:10881000F200A4F8F20094F8F430401C584390425F -:1088200009D26879401E002805DD6971B4F8F200AC -:10883000401CA4F8F200B8F1000F00F0F58194F8A4 -:108840001801002800F0EC8113B00220BDE8F08F81 -:10885000BAF1000F08BFFFDFE08A40F27121484300 -:10886000490001EB400210980021002806D000FBCF -:1088700002F14F48B1FBF0F000F10101C4F808111A -:10888000608840F2E24100FB01F210994FF00000D5 -:1088900008D001FB02F100E042E04548B1FBF0F0F6 -:1088A00000F10100C4F80C010AF101064FF00100CB -:1088B000FCF7A4FD3F494FF47A7B0844B0FBFBF082 -:1088C000E18A40F271225143C0EB4101D4F8080122 -:1088D0000190091A314401F2C246607D510010FB3B -:1088E00001F00C900120FCF789FD33490844B0FBEE -:1088F000FBF1019801EB40010C9801EB000B01200A -:10890000FCF770FD584400F1620128484161816123 -:10891000A6EB0A00401EB0F53D7F38BFFFDF42E7FF -:10892000E28A40F271215143D4F8FC00109A00EB26 -:1089300041010020002A06D01D4802FB01F2B2FBD3 -:10894000F0F000F10100C4F80801628840F2E2434F -:1089500002FB03FC109B4FF0000206D0144A03FBFD -:108960000CF3B3FBF2F202F10102C4F80C21039AFA -:108970009AB9B9F1000F38D094F85200FCF73EFDD7 -:10898000014694F8520002280CBF054A054A1144DA -:1089900001F2E1424FF47A7110E026E0580E002017 -:1089A00004360200A224020042230200E800002054 -:1089B00040420F007D2A020083290200B2FBF1F140 -:1089C000D4F80821E38A114440F2712CD4F8FC2039 -:1089D00003FB0CF302EB4302561AFCF703FDABEB6F -:1089E00000003044A0F1200600E00E1AD4F8002167 -:1089F000D4F8F810D4F8080101FB020B607D40F2B6 -:108A0000E24110FB01F00C9094F852A05046FCF7A4 -:108A1000F5FC0146BAF1020F0CBFF948F9480844C9 -:108A200000F2E1414FF47A70B1FBF0F000EB4B0142 -:108A30000C9801EB000B5046FCF7D4FC584400F1B5 -:108A40006001F14840F2712341616288D4F80C1151 -:108A50005A43C1EB4201A1F213318161012084F834 -:108A60000401A0E6628840F27123D4F80C115A4345 -:108A7000C1EB420202FB00F6DDE903020244D4F836 -:108A80000001D4F8F8C0121AD4F80831521E0CFBB9 -:108A9000003002FB010B607D40F2E24110FB01F06F -:108AA0000C9094F852000190FCF7A8FC0146019844 -:108AB000022814BFD348D248084400F2E1414FF4E1 -:108AC0007A70B1FBF0F000EB4B010C9801EB000B5E -:108AD0000198FCF787FC584400F16001CA48B9F1DD -:108AE000000F4161A6F2133181613FF45CAEBAF12F -:108AF000000F08BFFFDF56E6628840F27123D4F80A -:108B00000C115A43C1EB420101FB00F694F86300DB -:108B100025281CBF94F8640025280AD1B4F87C01EC -:108B2000381A00B2002804DB94F87F01002818BF2F -:108B30000B900C9828B1039880B3BBF1000F18BFBD -:108B4000FFDFDDE903010144D4F80C0101FB00FA69 -:108B50000B98FCF753FC01460B9802280CBFA84861 -:108B6000A848084400F2E1414FF47A70B1FBF0F0FC -:108B700000EB4A0A0B98FCF735FC504400F1600109 -:108B8000A14840F2712341616288D4F80C115A4324 -:108B9000C1EB4201A1F21331816104E6FFE7BBF1B1 -:108BA000000F14BFBAF1000FFFDF0B98FCF726FC93 -:108BB0000B9902290CBF92499249084400F2E14105 -:108BC0004FF47A70B1FBF0F0361A94F85200FCF7CB -:108BD00009FCABEB00003044A0F12006B1E700BF78 -:108BE000B9F1000F7FF40EAE94F8040100283FF4B1 -:108BF00022AE618840F27122D4F80C015143C0EBDF -:108C00004101284606F02EFD0004000C3FF413AE8F -:108C10001D99002918BF0880012013B0BDE8F08F0E -:108C200094F85401FAF781FA94F854012946FAF7B6 -:108C300069F900281CBF88F0010084F819010020A0 -:108C400013B0BDE8F08F2DE9F04F704C804683B033 -:108C500020788A4600256C4E4FF00209032804BF95 -:108C6000207B40457CD1606830612078032818BFA4 -:108C7000FFDF0327BAF1080F70D2DFE80AF0040E15 -:108C80001B1B166F6F6A6562FCF74FFF002818BF49 -:108C9000FFDFB77003B0BDE8F08FFDF7CBF8002819 -:108CA00018BFFFDF03B0BDE8F08F03B0BDE8F04FA1 -:108CB000FCF7FAB927752574E07A012658B14FF40C -:108CC0007A71A069F9F7DFFBA061002104F11000BF -:108CD00006F0C8FC1AE001216846FAF71AFF9DF871 -:108CE000000042F210710002B0FBF1F201FB12052C -:108CF000FCF793FD05442946A069F9F7C4FBA06180 -:108D0000294604F1100006F0ADFC461C208C411CE5 -:108D10000A293CBF30442084606830B1208C401C5C -:108D20000A2828BF84F8159000D26775607A002859 -:108D30001CBF03B0BDE8F08F207B04F11001FAF7EF -:108D4000E1F8002808BFFFDF03B0BDE8F08F07E0BF -:108D500004E0207BF9F76DFE2570F5E7FFDFF3E710 -:108D6000B8F1200F28BFFFDF294F072137F818007F -:108D7000F7F774FE040008BFFFDFB8F1200F28BF2B -:108D8000FFDF37F818002188884218BFFFDF4FF057 -:108D900001083461BAF1080F80F04481DFE80AF07D -:108DA000049AA2A29DEEEEEDC4F85851F580C4F8E5 -:108DB0005C5194F8190138B9F9F75AFED4F8241126 -:108DC000FAF767FB002825DCB4F81611B4F8580050 -:108DD000814206D1B4F8CC10081AA4F8CE0020467F -:108DE00005E0081AA4F8CE00B4F816112046A4F83D -:108DF0005810D4F84011C4F82411C0F8481127E0E5 -:108E000004360200A2240200E8000020580E0020D0 -:108E1000800E0020B4F81411B4F85800081AA4F811 -:108E2000CE00B4F814112046A4F85810D4F8241138 -:108E3000C4F84011C4F84811D4F82C11C4F8D81063 -:108E4000D4F83011C4F84C11B4F83411A4F850110E -:108E500003F0D7FFF9F7E6FD94F852A00746504615 -:108E6000FCF7CCFABAF1020F0CBFFE49FE490844E8 -:108E70004FF47A7100F2E140B0FBF1F1D4F80C014B -:108E800040F27122014460885043C1EB4000A0F1E0 -:108E9000300AB72F98BFB7272146012006F026FCDD -:108EA0003844AAEB0000A0F21937A246214601205F -:108EB00006F01CFCDAF824109C30814288BF0D1AA1 -:108EC000F760BD4228BF3D46B56084F8188186F83A -:108ED000029039E704F0DBF801E0FCF7E5F884F8EC -:108EE000188131E7F9F7C4FDD4F84821014610464E -:108EF000FAF7CFFA48B1628840F27123D4F80C1126 -:108F00005A43C1EB4201B0FBF1F094F864100D2913 -:108F10000FD0B4F85810B4F816210B189A42AEBF0F -:108F2000501C401C0844A4F8160194F81A0178B9A2 -:108F300005E0B4F81601401CA4F8160108E0B4F8E6 -:108F40001601B4F8CC10884204BF401CA4F81601E6 -:108F5000B4F85201DFF81493401CA4F85201B4F89D -:108F60007E00B4F87C100DF1080B401AB4F85810CC -:108F7000401E08441FFA80FA17E045E052E03078BE -:108F8000002339F81000CDE9005B94F8641139F83A -:108F90001110084481B22046FFF736FB00283FF449 -:108FA000D3AE012818BFFFDF26D0B4F81621AAEBF4 -:108FB000020000B20028E2DA082084F8730084F886 -:108FC0007280204603F0D2FB84F8045194F8545187 -:108FD0004FF6FF78202D00D3FFDF27F8158094F897 -:108FE0005401F9F726FD202084F85401307903B0AC -:108FF000BDE8F04FF2F77EBEB4F81601BDF80810D8 -:109000000844A4F81601D0E794F80401042818BF16 -:10901000FFDF84F8045194F854514FF6FF78202D67 -:10902000DBD3D9E7FFDF8FE610B5914C207850B144 -:1090300001206072FCF71DFF2078032805D0207AFC -:10904000002808BF10BD0C2010BD207BFAF76DF87A -:10905000207BFAF7B8FA207BF9F7EBFC002808BF71 -:10906000FFDF0020207010BD2DE9F04F804F83B04E -:10907000387801244FF0000840B17C720120FCF7E1 -:10908000F8FE3878032818BF387A0DD0DFF8E4915D -:1090900089F8034069460720F7F76BFC002818BFE2 -:1090A000FFDF4FF6FF7440E0387BFAF73EF8387B7D -:1090B000FAF789FA387BF9F7BCFC002808BFFFDF14 -:1090C00087F80080E2E7029800281CBF90F804119E -:1090D00000292AD00088A0421CBFDFF89CA14FF0D5 -:1090E000200B3AD00721F7F7B9FC040008BFFFDFD7 -:1090F00094F85401FAF767FA84F8048194F854510B -:109100004FF6FF76202D28BFFFDF2AF8156094F870 -:109110005401F9F78EFC84F854B169460720F7F73B -:1091200028FC002818BFFFDF12E06846F7F7FFFBB6 -:109130000028C8D011E0029800281CBF90F8041144 -:10914000002905D00088A0F57F41FF39CAD104E08D -:109150006846F7F7ECFB0028EDD089F8038087F824 -:109160000B8003B00020BDE8F08F70B50446434883 -:1091700090F80004424D400995F8001449098842CE -:1091800018BFFFDF95F8140D40093E4991F800140F -:109190004909884218BFFFDF3649002001220C71BF -:1091A00088700A704870C87031490870BDE8704016 -:1091B0005AE73049087070472DE9F8432C4C0646B1 -:1091C0002078002875D13048F9F7D8FB2073202883 -:1091D0006FD0032766602770002565722572AEB1D7 -:1091E000012106F1F400FAF70CFD0620F7F7E0FB89 -:1091F00080460720F7F7DCFB96F8F4104044B1FBFB -:10920000F0F200FB1210401C86F8F400F9F70AFC9B -:109210001E49091838BF40F2F65000F59D7086B21D -:10922000FCF7D7FAE061FCF7F8FA4FF0010878B3E1 -:1092300084F80A8001216846FAF76BFC9DF800006B -:1092400042F210710002B0FBF1F201FB1200064481 -:10925000F9F70EFC3146F9F716F9A0612775677525 -:10926000257416E004360200A22402004223020004 -:10927000580E0020E8000020800E002001E000E0F1 -:109280000BE000E019E000E0478C01000AFAFFFF64 -:1092900012E0207B04F11001F9F734FE002808BF2A -:1092A000FFDF25840020FCF7E4FD0020BDE8F88303 -:1092B000FFE70C20BDE8F883F9F7DAFB3146F9F750 -:1092C000E2F8A061A57284F80B80C7E72DE9F047AA -:1092D00082B00026044680F80461A0F85061DFF8EF -:1092E00000944288FD4FD0F8288099F8000094F847 -:1092F000641137F8100037F8111008440104090C04 -:10930000304605D001FB02F0F649B0FBF1F0401CFD -:109310001FFA80FA2146012006F0E8F9054694F884 -:109320005200FCF76BF894F8521002290CBFEE497A -:10933000EE4908444FF47A7100F2E140B0FBF1F1DC -:10934000608840F271225043C1EB4000A0EB0A005C -:10935000A0F55970A84534BF29464146814203D241 -:10936000A8452CBF4046284660620096019699F8B1 -:10937000000094F86411002337F8100037F811103A -:109380001A46084481B22046FFF73EF9002818BF6C -:10939000FFDFC4F800610120C4F8F86084F804011C -:1093A000A4F81661A4F8146184F81A61B4F858009E -:1093B000401EA4F85800A4F8526102B00020BDE895 -:1093C000F087C74948707047C94810B5417A0124F1 -:1093D000002918BF002408D1C17A31B1406AC549BB -:1093E000884284BF0024FCF740FD204610BD70B5C4 -:1093F000BB4C0546E088401CE080D4E9020162785D -:10940000D5F85861002A1CBF324606F053F9A06017 -:10941000864208D895F80401012804D0E078002895 -:1094200004BF012070BD002070BD70B50D4640F234 -:10943000E24100FB01F42846FBF7E0FF022D0CBFE0 -:10944000A949AA4908444FF47A7100F2E140B0FBFF -:10945000F1F000F54D7084428CBF201A002070BDE1 -:109460002DE9F04383B00026044680F8186190F897 -:10947000D600002807BF94F80401032803B0BDE814 -:10948000F083F9F7F5FAD4F8482101461046FAF7C7 -:1094900000F80028DCBF03B0BDE8F083628840F22A -:1094A0007123D4F80C115A43C1EB4201B0FBF1F027 -:1094B000411CB4F858000144A4F81411B4F8CC10BD -:1094C000B4F81421891A09B20029DCBF03B0BDE841 -:1094D000F083012184F81A11B4F87E10B4F87C20CE -:1094E0007E4F891A491E084485B2DFF8F4810DF1D8 -:1094F00008091EE098F8000037F81000CDE900696F -:10950000B4F8142194F86411012337F811100844B9 -:1095100081B22046FFF778F8002804BF03B0BDE809 -:10952000F08301280FD0022812BFFFDF03B0BDE88F -:10953000F083B4F81401281A00B20028BCBF03B0AD -:10954000BDE8F083D6E7B4F81401BDF8081008446C -:10955000A4F81401EDE7F0B5DFF884C104265F4BF1 -:109560009CF80020002583B006297DD2DFE801F0B9 -:10957000073C03191941044680F8046107E00446DA -:109580009CF80300002818BF84F804610BD0F9F799 -:109590007AF9A4F85251B4F85800A4F8160184F8E6 -:1095A0001A5103B0F0BD33F8120094F804210121E0 -:1095B000032A13BF94F80421C4F80051C4F8F850EA -:1095C000012AE4D1CDE9001594F86411B4F8CC2057 -:1095D00033F811100023084481B22046FFF714F835 -:1095E000002818BFFFDFD2E7032180F8041103B081 -:1095F000F0BD0446B0F802C0866A90F8640133F802 -:10960000121033F8100008440104090C4FF0000058 -:1096100005D001FB0CF03349B0FBF1F0401C87B2E0 -:109620002146012006F062F8054694F85200FBF747 -:10963000E5FE94F8521002290CBF2B492B4908442F -:109640004FF47A7100F2E140B0FBF1F0618840F232 -:1096500071225143C0EB4100C01BA0F55970AE42CE -:1096600034BF2946314600E008E0814203D2AE42D1 -:109670002CBF30462846606203B0F0BDFFDF03B068 -:10968000F0BD2DE9F8431A4C0327154EE27AA17A72 -:1096900042F21079002550B1012843D002281CBFA6 -:1096A000FFDFBDE8F8834FF000081AB95EE04FF025 -:1096B00000080AB1E5722EE051B101216846FAF7BF -:1096C0004DFA9DF800000002B0FBF9F109FB11080A -:1096D000FCF7A3F800EB0801A0690DE042230200AB -:1096E000E800002040420F0004360200A2240200DD -:1096F000580E0020DB821300F8F7C5FEA061257428 -:109700006775607A30B9207B04F11001F9F7FAFB34 -:1097100000284BD02584F9F7B6F83079BDE8F84336 -:10972000F2F7E8BAE572A7692570012020720021DE -:10973000606805F035FB6068C0F84871217B80F8EF -:109740005411616AC0F84C71C0F8581190F8545126 -:109750000788202D28BFFFDF3C4820F8157060687F -:10976000FFF7B4FD002818BFFFDFD4E751B1012196 -:109770006846FAF7F3F99DF800000002B0FBF9F132 -:1097800009FB1108FCF749F800EB0801A069F8F79C -:109790007AFEA06125746775607A0028BAD1207BB3 -:1097A00004F11001F9F7AEFB0028B3D1FFDFB1E7F8 -:1097B00070B5274CA178022906BFE188002970BD49 -:1097C0002569C5F85C0195F85200FBF70BFED5F84A -:1097D0005C11081AA1680144A160E1680844E060D6 -:1097E00070BD70B505461A488378022B06BF006924 -:1097F00000F5AC74174C002904BF256070BD012929 -:1098000008BF681E0DD002291CBFFFDF70BD1046C7 -:10981000FBF703FE4FF47A7100F2E140B0FBF1F088 -:10982000281A206070BD0C48007800281CBF00205A -:10983000704710B50720F7F7ADF880F0010010BDB4 -:1098400005480078002818BF01207047800E0020CE -:10985000E80000207C0E0020580E0020F8490C285B -:10986000896881F8C3001ABF13281828704700229E -:1098700011280FD0072808BF704715280AD00128E3 -:109880001ABF002802287047A1F88220012081F821 -:1098900086007047A1F88820704770B5E84CA16831 -:1098A0000A88A1F8362181F8340191F85100012885 -:1098B00008BF012508D0022808BF022504D00428CB -:1098C00016BF08280325FFDFA06880F8385190F8FC -:1098D0005200012808BF012508D0022808BF022530 -:1098E00004D0042816BF08280325FFDFA068012143 -:1098F00080F8395180F83211002180F80611E078A3 -:10990000BDE87040F2F7F6B9F0B4CD48806890F841 -:109910004E30478EC68E458FB0F84010C28FB0F8DB -:1099200042C0022B1FD08D4238BF294601866245B6 -:1099300028BF62468286018FB0F84430994238BF12 -:109940000B464386818FB0F84640A14238BF0C4693 -:10995000C486BB4228BF1F464786B44228BF26465E -:10996000C686F0BC7047038E9D4228BF1D46838E7D -:109970009A4228BF1A46A94298BF0D4605869445CB -:1099800098BF62468286002180F84E10D3E7AC4A29 -:10999000012992681BD0002302290FD0032921D06E -:1099A00028B301282ED0032818BF704792F863000F -:1099B00013281CBF1628182805D1704792F8C30039 -:1099C000002808BF7047D2F8F0000370704792F883 -:1099D000C300012808BF7047D2F8F4000178491E7F -:1099E0000170704792F8C3000328ECD17047D2F899 -:1099F000F000B2F858108288891A09B20029A8BF6D -:109A000003707047B2F85800B2F8FA10401A00B26A -:109A10000028E1DA70472DE9F04100260327884C41 -:109A20000125A0B1206906F0CCF9A16881F8C20037 -:109A300005FA00F010F4000F08BFFFDFA06880F8FF -:109A40006370A0F8826080F88650BDE8F081A0685D -:109A50000023194690F86420583005F0A2FD002834 -:109A600004BF6570BDE8F0816078002818BFBDE8CC -:109A7000F081206906F0A5F9A16881F8C10081F89C -:109A80006470A1F8886081F88A50BDE8F08170B5F3 -:109A90006B4C84B0207910F0010F04BF04B070BD8E -:109AA000206900230521C578A06890F8632058300C -:109AB00005F077FD002818BF022D0FD00B2D18BF21 -:109AC000042D0BD0052D18BF062D07D00D2D18BF66 -:109AD000112D03D0607840F0080060706078002895 -:109AE0001CBF04B070BD2069C078801E162880F0AD -:109AF0005283DFE800F00BFBA7C5FA26FBF9FB9ABF -:109B0000F8FCFBFBFBE3F6F5F4F3F2F1A0680023AD -:109B1000012190F86620583005F043FD002840F000 -:109B2000B583206906F0A8F9A16881F8EE00072046 -:109B300081F86600002081F88A0081F8860000F034 -:109B4000A5BBA0680921002390F86320583005F0D8 -:109B500028FD20B1206906F0DFF9122814D0A06892 -:109B60000A21002390F86320583005F01AFD20B137 -:109B7000206906F0D1F9142821D0206906F0CCF92B -:109B8000162840F0838342E0A0680125002390F866 -:109B900063200921583005F004FD002808BF6570D6 -:109BA00000F074836078002840F07083A16881F829 -:109BB0007A0081F8860081F8630000F067BBA06836 -:109BC0000021012580F86310A0F8821080F886102B -:109BD0000421FEF71FFBA06890F84E10012900F049 -:109BE0007C820288A0F81621028EA0F81821828EAD -:109BF000A0F81A21428E00F58671A0F81C21C08EB3 -:109C000048820D72E078F2F775F800F03FBBA0686B -:109C100090F86310202940F03983002180F8631008 -:109C200080F886101A2000F02FBBA06890F863100F -:109C30000F292AD1002180F8681012213AE0000093 -:109C400004010020A06890F8631013291DD1D0F8FA -:109C5000F01000884988814218BFFFDFA068D0F863 -:109C6000F00000F12601206906F033F9A06800F148 -:109C7000BC01206906F035F91620A16800F064B92E -:109C8000A26892F86300162802D0022000F064BA9D -:109C9000D2F8F00002F1A80300F11E0100220E30FC -:109CA00005F007FCA0680021C0E92611012180F819 -:109CB0006810182180F8631000F0E8BA206906F0F7 -:109CC000B0F9032840F0E282206906F0AEF900BF47 -:109CD00001F022FC00F0DABA8DE202E2AEE152E1DC -:109CE0001EE135E103E050E0C4E004E0D5E1206985 -:109CF00006F00EF9ECE7A06890F863101B29C4D1B8 -:109D0000002580F88B5080F88650D0F8F01000883D -:109D10004988814218BFFFDFA068D0F8F0100D70AD -:109D2000D0F83C110A78002A18BFFFDF40F0F3801A -:109D300090F88C207AB180F88C500288CA80D0F8D4 -:109D40003C110D71D0F83C210D211170D0F83C214F -:109D50000188518010E00288CA80D0F83C110D7152 -:109D6000D0F83C2101211172D0F83C210C21117056 -:109D7000D0F83C21018851800088F6F779FFF6F78A -:109D8000D9FBE078F1F7B6FFC5E0A06800231946DB -:109D900090F86420583005F004FC50B9A068002306 -:109DA000082190F86320583005F0FBFB002800F0F4 -:109DB00027826078002840F06982A06890F88E00C1 -:109DC00010F0020F17D1206906F098F8A16881F809 -:109DD0008F00206906F094F8A168A1F8900020692E -:109DE00006F091F8A168A1F8920091F88E0040F079 -:109DF000020081F88E00A06890F88E1011F0010F1B -:109E000012D190F8642000231946583005F0C9FBA0 -:109E1000002808BFFFDF0121A06880F8641080F8E7 -:109E20008A100021A0F88810A06890F8631001291A -:109E300007D1002180F8631080F88610E078F1F7F0 -:109E400059FFA168D1F8F000098842888A4204BF0E -:109E50000178042940F01A8200250570E078F1F7B6 -:109E600049FFA06890F86310002908BF80F8865069 -:109E700000F00CBAA0680023072190F86320583046 -:109E800005F08FFB002800F0BB816078002840F0CF -:109E9000FD8102A9206906F079F8A0689DF80820E4 -:109EA000002590F89410114001F02F0180F89410D3 -:109EB00090F895109DF80920114001F0410180F8BB -:109EC000951080F88650D0F8F010008849888142BB -:109ED00018BFFFDFA068D0F8F0100D70D0F83C116B -:109EE0000A78002A18BFFFDF15D10288CA80D0F88F -:109EF0003C110D71D0F83C11029A8A60039ACA6035 -:109F0000D0F83C21072111700188D0F83C01418034 -:109F1000E078F1F7EFFEA06880F8635000F0B6B982 -:109F2000A0680023092190F86320583005F039FB20 -:109F3000002800F065816078002840F0A781A168C2 -:109F400081F87A0081F8860081F8630000F09EB9FC -:109F5000A0680023194690F86420583005F021FBD2 -:109F6000002800F04D816078002840F08F81A068C3 -:109F70000021A0F88810012180F88A10022180F8C1 -:109F8000641000F083B9A0680023194690F864209B -:109F9000583005F006FB00287ED0206905F0E0FF70 -:109FA00000287AD0206905F0D7FFA16808872069CA -:109FB00005F0CEFFA1684887206905F0CFFFA168B2 -:109FC0008887206905F0C6FFA168C88791F86300FB -:109FD0001D2813BF91F84E00012081F84E00012882 -:109FE00007D091F8FD00002804BF91F8FC0000287C -:109FF00003D01F2081F8640017E01E2081F8640060 -:10A000000A88A1F822210A8FA1F824214A8FA1F8F9 -:10A0100026218A8F01F58670A1F82821C98FC18376 -:10A0200001210175E078F1F765FEA0680021A0F834 -:10A030008810012180F88A1000F028B9A068002358 -:10A040000A2190F86320583005F0ABFA20B320695C -:10A0500005F086FFA8B1206905F07EFFA16808879A -:10A06000206905F075FFA1684887206905F076FF33 -:10A07000A1688887206905F06DFFA168C887FFF790 -:10A0800043FCA068002180F8861080F8631004214A -:10A09000FEF7C0F8A06801E01AE07CE090F84E10EE -:10A0A00001291AD00288A0F81621028EA0F81821E2 -:10A0B000828EA0F81A21428E00F58671A0F81C212C -:10A0C000C08E488201200872E078F1F713FEDDE0CF -:10A0D000607840F001006070D8E0022180F84E10F6 -:10A0E000D4E0A0680023194690F86420583005F0A9 -:10A0F00058FA80B3A06890F86300242812BF25287E -:10A10000607840F0200027D06846FBF7EDF9002882 -:10A1100008BF002105D0009805F053FE8DF8080017 -:10A1200002A9A06801AB162290F8630005F001FCBB -:10A13000A0B1A0689DF80420162180F8E42080F8E2 -:10A14000E5101A2180F86410012180F88A1000219E -:10A15000A0F888109AE053E0607097E0206905F05D -:10A1600022FFC0B1206905F018FFA16800F00700C8 -:10A1700081F84F00206905F014FF00F00701A06886 -:10A1800080F8501090F80721002A04BF90F80621AB -:10A19000002A04D024E00020FFF73DFC76E090F890 -:10A1A0004F3090F852C000F151029C4501BF127827 -:10A1B0008A42012180F87B1012D00288A0F82E215B -:10A1C00090F84F2000F5867180F8302190F850000B -:10A1D00081F82500012081F82000E078F1F78AFD60 -:10A1E000A068222180F86410012180F88A100021E3 -:10A1F000A0F888104AE0A06890F86300202801D0F9 -:10A200000120A9E7206905F0D8FEC0B3206905F058 -:10A21000C4FE00F0070060F30705206905F0C1FEE9 -:10A2200000F0070060F30F25A2680120002682F8E5 -:10A230008600A2F88260242082F86300D2F8080128 -:10A24000B2F851202946ADF8002005F020FB9DF81A -:10A250000020C1B28A4207BFA16881F8E860A26805 -:10A2600082F8E8109DF80110C0F30720814219BF61 -:10A27000A16881F8E900A06880F8E96006E0FFE7DE -:10A280000120FFF7C8FB1E20FFF707FBA068D0E9FD -:10A2900028134A1C43F10001C0E9282104B070BD15 -:10A2A0002DE9F047FE4D04464FF00007687808435B -:10A2B0006870287910F0200F2846806818BFA0F831 -:10A2C0007C7004D1B0F87C10491CA0F87C1090F888 -:10A2D0006910012639B990F863200023062158300F -:10A2E00005F05FF958B3A88810F4006F07D0A8688C -:10A2F00090F86910002918BFA0F874701FD1A868E1 -:10A30000B0F87410491C89B2A0F87410B0F8762027 -:10A310008A422CBF511A00218288521D8A4228BFCE -:10A3200080F87A60B0F87410B0F87620914206D3C5 -:10A33000A0F8747080F81261E878F1F7DBFC2879F6 -:10A3400010F0600F08D0A86890F8671021B980F865 -:10A3500067600121FDF75EFF4FF00808002C56D121 -:10A360006878002851D1287910F0040F0DD0A86822 -:10A3700090F86300032808BFFFDFA86890F8661014 -:10A38000072904BF2E7080F8667001F015F928794E -:10A3900010F0080F19D06878B8B9A868002190F8B3 -:10A3A000C300FFF7F4FAA86890F8C300FF2808BFBD -:10A3B000FFDFFF21A86880F8C31090F86610082915 -:10A3C00003D10221297080F86670FFF760FBA8783E -:10A3D00010F0080F16D0A8680023052190F863201C -:10A3E000583005F0DEF850B185F80180A868D0F843 -:10A3F0003C1108780C2808BF0020087002E00020FB -:10A4000003F04DFDA86801F010F800F06CFDA8689D -:10A41000A14600F1580490F8EC0030B9A27B00236B -:10A420000121204605F0BDF810B1208D401C20858B -:10A430003D21B9F1000F18D12878022808BF162055 -:10A440000ED0012804BFA86890F8EE0008D0687804 -:10A45000E8B110F0140F1CBF1E20E07602D005E01A -:10A46000E07603E010F0080F02D0E176A67641E036 -:10A4700010F0030F03D02A20E076A6763AE010F021 -:10A48000200F08BFFFDF2320E076A67632E094F8A5 -:10A490002E0028B1608D411C6185A18D884213D2A8 -:10A4A00094F8320028B1208E411C2186A18D88426B -:10A4B0000AD2218DE08C814203D3AA6892F8EC2065 -:10A4C00012B9A28D914203D32220E076A67611E044 -:10A4D000E17B31B1A18C814228BF84F81B80C5D2B9 -:10A4E00006E0A08C062803D33E20E076A67601E0A5 -:10A4F000A07EA0B1E7722773E7730221A868FDF779 -:10A5000089FEA86890F8C310012904D1D0F8F4009E -:10A510000178491E0170E878F1F7ECFB03E00021B7 -:10A52000A868FDF777FEBDE8F047FAF7ECBF5C4995 -:10A530004A788B781A430ED101280AD0087910F096 -:10A54000040F04D0886890F86600072803D0012023 -:10A550007047FDF74BBE0020704770B5504C064663 -:10A560000D46A0883043A08016F0020F04D016F0EC -:10A57000010F18BFFFDFE56016F0010F18BF25615E -:10A5800016F0020F12D0284605F01BFC062802D058 -:10A590000B282ED00AE0A06890F86310182905D186 -:10A5A0000021C0E92811012180F8691016F0800F00 -:10A5B0001CBF0820A07016F4806F08BF70BDA06893 -:10A5C000B0F8581080880844801D86B2284605F0EF -:10A5D000F8FB012804BFA068A0F8FA6015D028464F -:10A5E00005F0EFFB68B1284605F0EBFB182823D0F7 -:10A5F0000BE0A06890F86310122908BF0021D5D1A4 -:10A60000D2E7A068D0F8F0008680284605F0D9FB94 -:10A6100001281DD0284605F0D4FB08B3284605F0D4 -:10A62000D0FB182818BF70BDA068B0F8EA10284603 -:10A63000BDE8704005F0D3BCA06890F8E810002990 -:10A6400002BF90F8E91000290026A0F8EA60DCE7D4 -:10A65000A068B0F8FA102846BDE8704005F003BCC9 -:10A66000A068D0F8F00081882846BDE8704005F069 -:10A67000CABBF0B50A4C85B00026A060A680667003 -:10A68000A670054626700088FAF705FFA0680088C6 -:10A69000FAF727FFB5F8D000A168401C82B201E0AC -:10A6A0000401002001F1580004F085FD002818BFC6 -:10A6B000FFDF95F8640025280AD1B5F85810B5F8E1 -:10A6C000EA00081A00B20028A4BF6078002804D06D -:10A6D00095F8630025283BD119E0A06890F8E810B0 -:10A6E000002908BF90F8511080F8511090F8E91037 -:10A6F000002908BF90F8521080F852100020FFF790 -:10A70000CCF885F86460A16881F87B6020E0B5F83A -:10A710005810B5F8EA00081A00B20028A4BF607803 -:10A72000002815D1A06890F8E810002908BF90F81B -:10A73000511080F8511090F8E910002908BF90F8E6 -:10A74000521080F852100020FFF7A7F885F86360D8 -:10A75000A5F8D060A06890F8861039B1B0F88210E2 -:10A76000B0F88420914224BF05B0F0BD90F88A1063 -:10A7700039B1B0F88810B0F88420914224BF05B0F8 -:10A78000F0BDB0F88020B0F87E108A4224BF05B03A -:10A79000F0BD90F867208AB3B0F87C208A4224BFCD -:10A7A00005B0F0BD90F8C370FF2F00F02A81684615 -:10A7B000FAF774FE002808BFFFDF009805F03FFAA3 -:10A7C0000321009805F052FA0098017821F0100159 -:10A7D0000170394605F0C7FA192F80F0E780DFE8ED -:10A7E00007F02A22144EE5E5E61B7CE5E6E66CE57B -:10A7F000E5E5E5D8E6E6869FB8E5C500B0F87C104B -:10A80000062924BF05B0F0BDCCE7A06890F8ED1094 -:10A81000009805F02FFBCAE0A06890F8C4100098DB -:10A8200005F078FBC3E0A068D0F8F400411C009864 -:10A8300005F011FBBBE0A068D0F8F000817900982A -:10A8400005F0DDFAA068D0F8F0000189009805F065 -:10A85000CFFAA068D0F8F0004189009805F0B3FA6B -:10A86000A068D0F8F0008189009805F0B3FAA068DC -:10A87000D0F8F000C189009805F0B3FA97E0A0681D -:10A88000D0F8F000011D009805F0F8FAA068D0F8A3 -:10A89000F00000F10C01009805F0FAFAA068D0F879 -:10A8A000F00000F11E01009805F0F8FAA06800F130 -:10A8B000B801009805F000FB79E060690178009824 -:10A8C00005F012FB60698188009805F00FFB606954 -:10A8D0004188009805F00EFB69E0FE49D1E90001CE -:10A8E000CDE9020102A9009805F018FB5FE0A0681D -:10A8F000B0F84410009805F01BFBA068B0F84610B3 -:10A90000009805F019FBA068B0F84010009805F019 -:10A9100017FBA068B0F84210009805F015FB46E060 -:10A92000A068B0F84010009805F00AFBA068B0F8E5 -:10A930004210009805F008FBA068B0F84410009899 -:10A9400005F0F6FAA068B0F84610009805F0F4FAA1 -:10A950002DE0A06890F80811009805F01CFBA06895 -:10A9600090F80911009805F01AFB20E0A06890F813 -:10A97000E80004F087FF0146009805F028FBA06876 -:10A9800090F8E90004F07EFF0146009805F023FBF3 -:10A990000DE0A06890F8E510009805F040FBA06875 -:10A9A00090F8E410009805F03EFB00E0FFDFFAF7B6 -:10A9B00088FD002808BFFFDF009F384605F001FA38 -:10A9C000012809D0384605F0FCF960B1384605F099 -:10A9D000F8F918280FD014E0A068B0F8FA1038463B -:10A9E00005F041FA0DE0A068D0F8F0008188384603 -:10A9F00005F009FA05E0A068B0F8EA10384605F05D -:10AA0000EEFAB5480090B54BB54A2946304603F0FA -:10AA100081F9A0680023052190F86320583004F0E4 -:10AA2000C0FD002804BF05B0F0BD05B0BDE8F04092 -:10AA300002F041BFAB48806890F8861029B1B0F8A9 -:10AA40008210B0F8842091421AD290F88A1029B16D -:10AA5000B0F88810B0F88420914211D2B0F880206C -:10AA6000B0F87E108A420BD290F86720B0F87C00D4 -:10AA700022B1884204D200BF03F0ECB90628FBD310 -:10AA8000002001460CE470B50C46064615464FF40E -:10AA9000A071204607F0C9F82680002D08BFFFDF0F -:10AAA0002868C4F8F0006868C4F8F400A868C4F81E -:10AAB0003C0170BDF6F7B3B82DE9F0410D460746ED -:10AAC0000621F5F7CBFF040008BFBDE8F081D4F8FC -:10AAD0003C110026087858B14A8821888A4207D15B -:10AAE000082810D00D281FD00C2835D0072850D0AA -:10AAF00094F8120100285ED06E700F20287084F840 -:10AB000012616F8042E06E7008202870D4F83C011A -:10AB10004168C5F802108168C5F80610808968810F -:10AB2000D4F83C01067031E00846F6F7A1F8074674 -:10AB3000F5F716FDB8B96E700D202870D4F83C01F9 -:10AB40004068C5F80200D4F83C0106703846F5F7B5 -:10AB500001FD0120BDE8F0810846F6F789F80746B7 -:10AB6000F5F7FEFC10B10020BDE8F0816E700C20FE -:10AB70002870D4F83C014168C5F802100089E880CB -:10AB8000D4F83C0106703846F5F7E4FC0120BDE836 -:10AB9000F0816E7007202870D4F83C01416882680B -:10ABA000C068C5F80210C5F80620C5F80A00D4F838 -:10ABB0003C010670EAE794F81401C8B16E701420E5 -:10ABC000287094F814010028E0D000BF84F81461C4 -:10ABD000D4F81601C5F80200D4F81A01C5F8060029 -:10ABE000B4F81E01688194F814010028EED1CDE775 -:10ABF00094F8200180B16E701A20287084F82061CA -:10AC0000D4F82201C5F80200D4F82601C5F80600E0 -:10AC1000B4F82A016881B9E794F82C0148B16E7044 -:10AC20001B20287084F82C61D4F82E01C5F802008E -:10AC3000ACE794F80C0190B16E701820287094F86D -:10AC40000C010028A2D000BF84F80C61D4F80E01DA -:10AC5000C5F8020094F80C010028F5D196E794F8A5 -:10AC60003201002808BFBDE8F0816E701520287001 -:10AC700094F83201002889D084F83261D4F8340184 -:10AC8000C5F80200B4F83801E88094F832010028D1 -:10AC9000F2D17BE7134A5061D17070472DE9F0473C -:10ACA0000446481E85B238BFBDE8F08704F10808A5 -:10ACB0000126DFF830904FF0080A0027B4F8D000E2 -:10ACC000401CA4F8D000B4F87C00401CA4F87C0020 -:10ACD0000AE000005C230200A1A201002FA50100F0 -:10ACE0005BA501000401002094F8690040B994F8C4 -:10ACF00063200023062104F1580004F052FCD8B16F -:10AD0000B4F87400401C80B2A4F87400B4F8761053 -:10AD100081422CBF0A1A0022A3885B1D934228BFE0 -:10AD200084F87A60884207D3A4F8747084F81261BA -:10AD300099F80300F0F7DEFF94F8860020B1B4F82C -:10AD40008200401CA4F8820094F88A0020B1B4F874 -:10AD50008800401CA4F8880094F8EC0040B994F8EE -:10AD600066200023012104F1580004F01AFC20B1F0 -:10AD7000B4F88000401CA4F8800094F863000C280C -:10AD800002D00D2820D067E0B4F85800411CB4F878 -:10AD9000FA00814260D1D4F8F400411C404607F02B -:10ADA00050F80221204604F034F9D4F8F400007879 -:10ADB000002808BFFFDF0121FF20FEF7E8FD84F82F -:10ADC000637084F8966047E0B4F85800411CD4F8EA -:10ADD000F000808881423FD1D4F83C0101780029FD -:10ADE00018BFFFDF22D12188C180D4F8F00041894B -:10ADF000D4F83C010181D4F8F0008189D4F83C01F9 -:10AE00004181D4F8F000C189D4F83C018181D4F8A3 -:10AE10003C010771D4F83C0180F800A0D4F83C0153 -:10AE20002188418099F80300F0F764FF0121204652 -:10AE300004F0EFF803212046FDF7ECF9D9F80800FB -:10AE4000D0F8F0000078022818BFFFDF0221FF20B1 -:10AE5000FEF79DFD84F86370B4F85800401C691E2D -:10AE6000A4F858008DB2BFF429AFBDE8F087FE4AC0 -:10AE7000C2E90601704770B50446B0F87C0094F84A -:10AE80006710002908BFC0F1020503D0B4F87E1096 -:10AE9000081A051F94F87A0040B194F86320002343 -:10AEA000092104F1580004F07CFBA0B1B4F87460EF -:10AEB00094F8690058B994F863200023062104F13E -:10AEC000580004F06EFB002808BF284603D0B4F8F1 -:10AED0007600801B001F8542C8BF0546002DD4BFE9 -:10AEE0000020A8B270BDF0B5DF4C83B0A06890F828 -:10AEF000C310FF2907BF6178002903B0F0BD90F8A7 -:10AF0000662000230121583004F04BFB00281CBFB1 -:10AF100003B0F0BDA06890F8EC1029B103B0022096 -:10AF2000BDE8F040FEF79ABC90F863200023194674 -:10AF3000583004F036FB48B1A06890F87A0028B188 -:10AF400003B01220BDE8F040FEF788BCA0680025E1 -:10AF500090F86320122A23D004DC032A47D0112A58 -:10AF600024D003E0182A3CD0242A4CD0002304210A -:10AF7000583004F016FB00281CBF03B0F0BDD4F815 -:10AF800008C0022701269CF864001A2800F01E81E0 -:10AF900041DC012873D002287FD0032863D03EE033 -:10AFA00003B00B20BDE8F040FEF758BCF8F7D5FD24 -:10AFB0000C283CBF03B0F0BDA0680821D0F8F00019 -:10AFC0001E30F8F7CBFD28B1A0680421B830F8F79F -:10AFD000C5FD00B9FFDF03B00320BDE8F040FEF778 -:10AFE0003DBC03B00620BDE8F040FEF737BC90F84A -:10AFF000C21080F8C4100720FEF730FCA06880F86B -:10B00000635003B0F0BD1820FEF728FCA068A0F83C -:10B01000825003B0F0BD1F2847D022287ED0DCF834 -:10B02000F0000178002900F010814088BCF8001081 -:10B03000884274D100239CF8632019460CF1580013 -:10B0400004F0AFFA00286AD0A068D0F8F0100978B0 -:10B05000022972D0032971D0042970D0052908BFB4 -:10B0600008206DD0F1E09CF8C1008CF8C4000720E6 -:10B07000FEF7F4FBA06800F0B0B900E00DE00C2092 -:10B08000FEF7ECFBA068A0F8885090F88E1041F015 -:10B09000010180F88E1000F0A0B91320FEF7DEFB4E -:10B0A000A068A0F8885000F098B99CF8FD0000282E -:10B0B0001CBF03B0F0BD9CF8FC0088B1BCF8FE00DA -:10B0C000ACF84000BCF80001ACF84200BCF802014A -:10B0D000ACF84400BCF80401ACF846008CF8FC5015 -:10B0E000FEF712FC0421A068FDF794F8A06890F820 -:10B0F0004E10012908BF80F84E7016D00288A0F8C3 -:10B100001621028EA0F81821828EA0F81A21428EF4 -:10B1100000F58671A0F81C21C08E01E011E094E0DA -:10B1200048820E72E078F0F7E5FD1520FEF796FBF9 -:10B13000A068A0F8885000F050B94CE051E071E0F0 -:10B1400058E09CF87B0058B18CF8E8508CF8E95036 -:10B150001820FEF783FBA068A0F8885003B0F0BD6C -:10B160009CF8070100281CBF03B0F0BD9CF8060145 -:10B17000002804BF03B0F0BDBCF84F10DCF8080194 -:10B18000ADF80410BCF85110ADF80010019904F0AE -:10B190007EFB9DF80020C1B28A4207BFA16881F8FA -:10B1A000E850A26882F8E8109DF80110C0F307206B -:10B1B000814219BFA16881F8E900A06880F8E950D0 -:10B1C000182003B0BDE8F040FEF748BB1120FEF7A1 -:10B1D00045FBA06801E190F8640004F0D5F9A0BB3C -:10B1E00008E090F8681041B190F86900002808BFA5 -:10B1F000FFDF0A20FEF732FB27E0F8F7AEFC0C2851 -:10B2000023D3A0680821D0F8F0001E30F8F7A6FC80 -:10B2100028B1A0680421B830F8F7A0FC00B9FFDF1E -:10B220000320E7E790F88E0010F0030F0DD10C20FB -:10B23000FEF714FBA068A0F8825080F8866090F8B2 -:10B240008E1041F0010180F88E10A06890F8C310B4 -:10B25000FF291CBF03B0F0BD90F8632000231946FE -:10B26000583004F09EF901E004010020002804BFDA -:10B2700003B0F0BDA06890F8F810E9B3A1690978AF -:10B28000D1BB90F8640004F07FF9A8BBA068B0F8C7 -:10B2900058100A2935D900F108010522E06906F0A5 -:10B2A000FFFB0028A06802BF80F8F85003B0F0BD93 -:10B2B000D0F8F400017869B1411C0522E06906F07C -:10B2C000EFFB00281CBF03B0F0BDA068D0F8F4006D -:10B2D000007830B9A068E169D0F8F400401C06F0AD -:10B2E000B0FDA068D0F8F4000178491C017001207D -:10B2F000FEF7B4FAA06800E003E080F8F85003B06D -:10B30000F0BDA06890F8FC1011B190F8FD1011B3D9 -:10B3100090F80611002904BF03B0F0BD90F80711A2 -:10B3200000291CBF03B0F0BD90F8640004F02CF9B4 -:10B3300000281CBF03B0F0BDA06890F8512090F821 -:10B340000811012A4DD0022A4ED0042A14BF082A1F -:10B3500004294BD05DE0B0F8FE10A0F84010B0F822 -:10B360000011A0F84210B0F80211A0F84410B0F893 -:10B370000411A0F8461080F8FC5090F864001E28D4 -:10B3800005D003B01420BDE8F040FEF767BAFEF721 -:10B39000BBFA0421A068FCF73DFFA06890F84E10AE -:10B3A000012908BF80F84E7013D00288A0F816213A -:10B3B000028EA0F81821828EA0F81A21428E00F584 -:10B3C0008671A0F81C21C08E48820E72E078F0F7DA -:10B3D00091FC1520FEF742FAA06880F8645003B093 -:10B3E000F0BD012915D101E0022912D190F85210C7 -:10B3F00090F80901012907D0022908D0042914BFB7 -:10B40000082904280BD004E0012802D107E0022813 -:10B4100005D003B01620BDE8F040FEF71FBA03B018 -:10B420000020BDE8F040FEF738BA70B5044690F849 -:10B43000630000250C2814D00D2818BF70BDB4F887 -:10B440005800D4F8F010401C8988884218BF70BD9D -:10B45000D4F83C01FE4E0178002918BFFFDF45D12A -:10B4600022E0B4F85800B4F8FA10401C884218BF23 -:10B4700070BDD4F8F400411C04F1080006F0E1FCB2 -:10B480000221204603F0C5FDD4F8F400007800281E -:10B4900008BFFFDF0121FF20FEF779FA84F863502F -:10B4A000012084F8960070BD2188C180D4F8F00096 -:10B4B000D4F83C1140890881D4F8F000D4F83C114C -:10B4C00080894881D4F8F000D4F83C11C089888183 -:10B4D000D4F83C010571D4F83C1108200870D4F868 -:10B4E0003C1120884880F078F0F704FC01212046C8 -:10B4F00003F08FFD03212046FCF78CFEB068D0F8E6 -:10B50000F0000078022818BFFFDF0221FF20FEF7BD -:10B510003EFA84F8635070BD70B5CD4CA16891F8C7 -:10B520006320162A11BF132A91F88C20002A627812 -:10B530001BBF02206070002A70BD81F8C00000258A -:10B5400081F88B5081F88650D1F8F0000988408846 -:10B55000884218BFFFDFA068D0F8F0000078032809 -:10B5600018BFFFDF0321FF20FEF711FAA068D0F813 -:10B570003C110A78002A18BFFFDF19D10288CA805F -:10B58000D0F83C2190F8C0101171D0F83C110D7228 -:10B59000D0F83C210C211170D0F83C210188518059 -:10B5A0000088F5F765FBF4F7C5FFE078F0F7A2FB3C -:10B5B000A06880F8635070BD10B5A54C207910F0DC -:10B5C000020F08BF10BD6078002818BF10BDE068EA -:10B5D000C078192880F06981DFE800F05F4F0D8F97 -:10B5E000F8F8A6223FF86F83B1F8F8F8F8F7E3E02F -:10B5F000F9F5F4F8F300A0680023012190F8662023 -:10B60000583003F0CEFF002818BF10BD0821A068F5 -:10B6100080F86610002180F8861080F88A1010BD2E -:10B62000A0680023194690F86420583003F0B9FF51 -:10B6300018B1A168002081F88A00A068002319468B -:10B6400090F86320583003F0ACFF002808BF10BD0D -:10B650000020A16881F8860010BDA068002319466B -:10B6600090F86320583003F09CFF002808BFFFDFEC -:10B670000420A16881F8630010BDA068002319466A -:10B6800090F86320583003F08CFF002808BFFFDFDC -:10B690000C20A16881F8630010BDA0680023194642 -:10B6A00090F86320583003F07CFF002808BFFFDFCC -:10B6B0000D20A16881F8630010BDA0680023194621 -:10B6C00090F86320583003F06CFF002808BFFFDFBC -:10B6D0000121A06880F88B105FF00F0180F86310E3 -:10B6E00010BDA06890F86300122818BFFFDF012189 -:10B6F000A06880F88C101121F0E7A068002319469B -:10B7000090F86320583003F04CFF28B9A06890F8F7 -:10B710008C00002808BFFFDF0121A06880F88B1093 -:10B72000132180F8631010BDA06890F863001828FA -:10B7300018BFFFDF1B20A16881F8630010BDA0685F -:10B74000D0F8F01003884A889A4204BF0978042987 -:10B7500019D190F8632000231946583003F021FFD7 -:10B76000002808BFFFDFA06890F88E1011F0020FCC -:10B7700004BF012180F8631005D0002180F88610F5 -:10B78000D0F8F0000170A0680023194690F86420FA -:10B79000583003F006FF002808BF10BD0020A16844 -:10B7A00080E0A0680023194690F86320583003F029 -:10B7B000F8FE002808BFFFDF0520A16881F86300BC -:10B7C00010BD30E01FE012E001E067E06DE0A0682E -:10B7D0000023194690F86320583003F0E2FE002859 -:10B7E00008BFFFDF1D20A16881F86300E8E7A068BB -:10B7F0000023194690F86420583003F0D2FE002848 -:10B8000008BFFFDFCAE7A0680023194690F863204D -:10B81000583003F0C6FE002808BFFFDF2020A168D3 -:10B8200081F86300CCE7A06890F8641022291DD04D -:10B8300090F86310242918BFFFDFC1D190F8E810F9 -:10B84000002906BF90F8E9100029252102E0000038 -:10B850000401002018BF80F863107FF4F9AE0021C6 -:10B8600080F863100846FEF718F8F1E690F8E81043 -:10B87000002907BF90F8E9100029252180F86410FD -:10B880008CD1002180F8641080F87B1090F80601BC -:10B8900000281CBF0020FEF700F87FE7A168002009 -:10B8A00081F8640081F88A008AE7FFDF88E70000FA -:10B8B00070B5FC4CE1680A88A1F8E62181F8E40142 -:10B8C00091F85100012808BF012508D0022808BFBF -:10B8D000022504D0042816BF08280325FFDFE068EE -:10B8E00080F8E85190F85200012808BF012508D0DF -:10B8F000022808BF022504D0042816BF0828032503 -:10B90000FFDFE068012180F8E95180F8E2110021B1 -:10B9100080F89211E078BDE87040F0F7EBB9F0B430 -:10B92000E048C06890F84E30478EC68E458FB0F81C -:10B930004010C28FB0F842C0022B1FD08D4238BFDA -:10B9400029460186624528BF62468286018FB0F88B -:10B950004430994238BF0B464386818FB0F8464049 -:10B96000A14238BF0C46C486BB4228BF1F4647864B -:10B97000B44228BF2646C686F0BC7047038E9D425F -:10B9800028BF1D46838E9A4228BF1A46A94298BFF7 -:10B990000D460586944598BF62468286002180F850 -:10B9A0004E10D3E72DE9F04FBE4C83B0207910F054 -:10B9B000010F04BF03B0BDE8F08F606901230521CA -:10B9C000C578E06890F86420583003F0EAFD00285C -:10B9D00018BF022D0BD00A2D18BF0B2D07D0032D39 -:10B9E00018BF062D03D0607840F0080060706078C2 -:10B9F00000281CBF03B0BDE8F08F60690227012654 -:10BA000090F8038000254FF02009B8F1000F1CBF0B -:10BA1000B8F1010FB8F1160F1FD1E06890F863007C -:10BA200003F0B2FDC8B1E16891F86300202814D09A -:10BA3000212808D0B8F1160F0CBF84F80190677068 -:10BA400003B0BDE8F08F262081F86300B8F1160F2F -:10BA500000F0AE822A20FFF72BFFB8F1190F80F01B -:10BA6000E282DFE808F046230DC1FEFEFDFCFBFE8E -:10BA700091B8FAFEFEFEFEF9F8F7F6F5F4FEF300D3 -:10BA8000E0680123194690F86620583003F089FDDC -:10BA9000002840F04D84606904F0EEF9E16881F817 -:10BAA0006801072081F8660000F042BCE0680123CD -:10BAB000002190F86420583003F073FD002800F056 -:10BAC000F083606904F0D3F9E168A1F87C01B1F872 -:10BAD0005820801A00B247F6FE728242A8BF0028A2 -:10BAE0004BDD01F5BF71606904F0B8F90B20E16826 -:10BAF0003FE0E0680123002190F86420583003F013 -:10BB000050FD002800F0CD83606904F083F900281F -:10BB100000F08982606904F07AF9E168A1F87C019B -:10BB2000B1F85820801A00B247F6FE728242A8BFD0 -:10BB3000002822DD606904F064F9E16881F87E0183 -:10BB4000606904F059F9E168A1F88001606904F0C6 -:10BB50003EF9E168A1F88201606904F03FF9E1680B -:10BB6000A1F88401606904F040F9E168A1F8860158 -:10BB70000D2081F8640000F0DBBB282081F8730001 -:10BB800081F8726000F0D4BBE0680123002190F8D6 -:10BB90006420583003F005FD0028E0680CD0A0F8C0 -:10BBA000885090F88A10491C80F88A105FF01001C4 -:10BBB00080F8641000F0BCBB90F8642001230521DC -:10BBC000583003F0EEFC00281CBF0820607040F0E5 -:10BBD000AF8300F066BBE06890F86410112908BFDD -:10BBE000122140F09282E3E7E0680123002190F8FF -:10BBF0006420583003F0D5FC80B9E06890F86420E8 -:10BC0000122A0BD001230521583003F0CAFC00286A -:10BC100018BF082000F0458300F0C7B9E06890F82D -:10BC20008C1031B9A0F8885090F88A10491C80F81F -:10BC30008A1000F1E001606904F037F9E06800F172 -:10BC4000B801606904F03CF9E0680BE01BE2AFE189 -:10BC500059E1F1E0CFE0DBE0EAE23AE0A2E0FFE226 -:10BC600022E072E190F8AA01002818BFFFDFE06827 -:10BC70000188A0F8AC1100F5D771606904F003F9F0 -:10BC8000E06800F5DB71606904F005F9E06880F8B0 -:10BC9000AA61142180F86410E078F0F72BF800F026 -:10BCA00047BB000024010020E06890F864101729C9 -:10BCB00040F02B8290F88A10491E49B280F88A1011 -:10BCC0000029B8BFFFDF1C20E16881F8640000F0A4 -:10BCD0002FBBE06890F8651011F0020F09D090F8C2 -:10BCE000632001230821583003F05BFC002800F09A -:10BCF000D882E06890F88E0010F0020F17D16069CA -:10BD000004F0FCF8E16881F88F00606904F0F8F84D -:10BD1000E168A1F89000606904F0F5F8E168A1F825 -:10BD2000920091F88E0040F0020081F88E00E068E9 -:10BD300090F88E1011F0010F05D0E06890F86310B4 -:10BD400006291CD114E090F8650010F0020F18BF0E -:10BD5000FFDFE06890F8651041F0020180F865109F -:10BD6000A0F8885090F88A10491C80F88A10E4E7FF -:10BD700080F8635080F88650E078EFF7BBFFE0680A -:10BD800090F87A11042940F0D38280F87A51E07853 -:10BD9000EFF7B0FFE06890F86310002940F0C88228 -:10BDA00000F043BAE06890F8650010F0010F7BD115 -:10BDB0006946606904F0B7F8E0689DF8002090F8E3 -:10BDC0009410114001F02F0180F8941090F8951014 -:10BDD0009DF80120114001F0410180F89510A0F874 -:10BDE000885090F88A10491C80F88A1090F86510E5 -:10BDF00041F001011CE0E0680123092190F8632073 -:10BE0000583003F0CEFB002800F04B8200F041BA1E -:10BE1000E06890F8651011F0040F40F04282A0F83D -:10BE2000885090F88A2041F00401521C80F88A2042 -:10BE300080F8651000F07CBAE06890F8650010F0BA -:10BE4000300F31D1606904F08BF800287DD0606933 -:10BE500004F082F8E1680887606904F079F8E16825 -:10BE60004887606904F07AF8E1688887606904F0BF -:10BE700071F8E168C887207910F0020F03D02069BB -:10BE8000C078142811D091F863001D280DD091F8C6 -:10BE90004E0001280BD091F88901002804BF91F8C9 -:10BEA000880100280AD002E074E081F84E6091F821 -:10BEB000650040F0100081F865001AE091F8650017 -:10BEC00040F0200081F865000A88A1F8CA210A8F95 -:10BED000A1F8CC214A8FA1F8CE218A8F01F5CB7031 -:10BEE000A1F8D021C98F818780F83260E078EFF720 -:10BEF00001FFE068A0F8885090F88A10491C80F88B -:10BF00008A1000F015BAE06801230A2190F8632036 -:10BF1000583003F046FBE8B3606904F021F8B8B18B -:10BF2000606904F019F8E1680887606904F010F8A6 -:10BF3000E1684887606904F011F8E1688887606902 -:10BF400004F008F8E168C88700E06CE0FFF7E7FC60 -:10BF5000E068052180F8865080F86350FDF7FBFA11 -:10BF6000E06890F84E10012908BF80F84E7000F08C -:10BF7000DF810288A0F8BE21028EA0F8C021828E47 -:10BF8000A0F8C221428E00F5CB71A0F8C421C08E6A -:10BF9000088600E006E081F82660E078EFF7AAFE68 -:10BFA00000F0C6B9607840F00100607000F0C0B9E0 -:10BFB000E06801230B2190F86420583003F0F1FA77 -:10BFC00020B100BF84F8019000F0B2B9E06801230D -:10BFD000002190F86420583003F0E3FA002800F0C4 -:10BFE0006081E06890F863002528EBD0606903F079 -:10BFF000DAFFC0B1606903F0D4FFE16800F0070028 -:10C0000081F85000606903F0C8FF00F00701E068A4 -:10C0100080F84F1090F89321002A04BF90F89221E5 -:10C02000002A04D022E001F0DEF900F081B990F896 -:10C0300052C090F8503000F151028C4502BF117887 -:10C04000994280F87B6011D000F5CB7180F8DC61FB -:10C050000288A0F8DE2190F84F2080F8E02190F8C7 -:10C06000500081F84B00E078EFF744FEE0682221B1 -:10C0700080F86410A0F8885090F88A10491C80F865 -:10C080008A1000F055B9E06890F8631021290CBFC0 -:10C090004FF001084FF0000890F86410232908BF02 -:10C0A00000F1640705D0B8F1000F18BF00F1630775 -:10C0B0002BD0606903F099FFF0B3D4F81490484690 -:10C0C00003F087FF0090484603F087FF8146E06851 -:10C0D00090F89211002907BF4FF0000BDA4690F854 -:10C0E00094B190F895A1484603F05AFBB0B1E268CC -:10C0F00092F85110814211D019EA0B0F41D0B8F1DA -:10C10000000F08BF012802D008E0677010E1022983 -:10C1100004BF92F8500010EA090F32D0009803F0E3 -:10C120003FFB68B1009803F03BFBE16891F85210C7 -:10C13000884205D0009800E023E010EA0A0F20D0E2 -:10C140006A466169E06803F03AFBD8B3606903F0BE -:10C150004AFFE168A1F87C01B1F85820801A00B2CA -:10C1600047F6FE728242A8BF00284ADD9DF8000013 -:10C1700081F87E019DF8010081F87F01252038704B -:10C1800044E0E06890F8920100281CBF1E20FFF7F1 -:10C190008FFBB8F1000F16D0606903F012FEE16862 -:10C1A00081F8C20006FA00F010F0807F08BFFFDFC0 -:10C1B0000A21E06880F8631090F88600002808BF24 -:10C1C000FFDF0DE010E03D70E16891F88A00401E4D -:10C1D00040B281F88A000028B8BFFFDF01F003F900 -:10C1E000E06880F87B50A3E0E06890F892010028B6 -:10C1F0001CBF0020FFF75CFB3D70E06880F87B50BF -:10C2000004E0282081F8730081F87260E06800F192 -:10C2100064018F4209D190F88A10491E49B280F812 -:10C220008A100029B8BFFFDF82E080F886507FE0E7 -:10C23000606903F0F6FE16287AD1E06890F8630092 -:10C24000212802D0262805D072E0606903F0EDFEB7 -:10C25000FFF72EFBE06880F8635080F8865067E0B7 -:10C26000E06890F863000E2804D1606903F054FE82 -:10C27000122805D0E06890F863001D2818D112E05C -:10C28000E0680123092190F86320583003F089F910 -:10C2900038B1E06880F87A5080F8865080F86350B2 -:10C2A00046E0667044E0606903F036FE142805D06D -:10C2B000E06890F8630021282BD125E0E068052193 -:10C2C00080F8635080F88650FDF745F9E16891F8F1 -:10C2D0004E00012808BF81F84E7029D00A88A1F8C5 -:10C2E000BE210A8EA1F8C0218A8EA1F8C2214A8EF1 -:10C2F00001F5CB70A1F8C421C98E018680F82660B3 -:10C30000E078EFF7F7FC13E0606903F005FE16280C -:10C3100005D0606903F000FE172809D113E0E0683A -:10C3200080F8635080F886505FF01A00FFF7C0FA7B -:10C33000E068D0E928134A1C43F10001C0E9282134 -:10C3400003B0BDE8F08FE06890F864102329EFD1C6 -:10C3500080F8645090F88A10491E49B280F88A101B -:10C360000029B8BFFFDFE06880F87B5090F89201A9 -:10C37000002818BF0020DBD0D8E770B5F84E05467E -:10C380000C46F06890F8C300FF2818BFFFDFF26882 -:10C390000020002C82F8C3501CBFA2F8880070BD9A -:10C3A000A2F88200012082F8860070BD10B584B02A -:10C3B00004466846F9F772F8002808BFFFDF0098C6 -:10C3C00003F03DFC0321009803F050FC0098017835 -:10C3D00021F010010170214603F0C5FCA01E1628B3 -:10C3E00073D2DFE800F00BAA4EABAB13AA5CAAAB8A -:10C3F0001B2CAAAAAAAAABAB31734B8DD848C06834 -:10C4000090F8C410009803F035FD97E0D448C06858 -:10C4100090F8C410009803F07DFD8FE0D04CA06828 -:10C420000178009803F060FDA0688188009803F00F -:10C430005DFDA0684188009803F05CFD7EE0062168 -:10C44000009803F063FD79E0C54CE068B0F8441053 -:10C45000009803F06DFDE068B0F84610009803F016 -:10C460006BFDE068B0F84010009803F069FDE068EB -:10C47000B0F84210009803F067FD5FE0B84CE06848 -:10C4800043E0B74CE06800F1E801009803F01CFDC0 -:10C49000E06800F1BC01009803F020FD4EE00020B0 -:10C4A00002900390AE48C06890F8941001F0F50136 -:10C4B0008DF8081090F8950002A900F041008DF861 -:10C4C0000900009803F05DFD38E036E0A44CE06818 -:10C4D000B0F84010009803F033FDE068B0F8421067 -:10C4E000009803F031FDE068B0F84410009803F0C4 -:10C4F0001FFDE068B0F84610009803F01DFD1DE038 -:10C50000974CE06890F8921159B190F89411009806 -:10C5100003F041FDE06890F89511009803F03FFDAD -:10C520000CE090F85110009803F035FDE06890F8A9 -:10C530005210009803F033FD00E0FFDFF8F7C1FF71 -:10C54000002808BFFFDF04B010BD70B50C460546DB -:10C550004FF4F871204605F068FB258070BDF4F7B4 -:10C560005EBB2DE9F0410D4607460721F4F776FA48 -:10C57000040008BFBDE8F08194F896010026C8B118 -:10C580006E700820287094F8960188B1268484F88B -:10C590009661D4F89801C5F80200D4F89C01C5F85A -:10C5A0000600B4F8A001688194F896010028EDD146 -:10C5B000AE7044E094F8A201002837D094F8A201AC -:10C5C0000C2818D00D2818BFFFDF38D12088F4F7C9 -:10C5D0004FFB0746F3F7C4FFA0B96E700D2028701B -:10C5E00094F8A401A8702088A88084F8A261384635 -:10C5F000F3F7B0FF23E02088F4F73AFB0746F3F7A0 -:10C60000AFFF10B10020BDE8F0816E700C202870E3 -:10C6100094F8A401A8702088A88094F8A801A871B3 -:10C6200084F8A2613846F3F795FF08E094F8DA0140 -:10C6300040B16E700F20287084F8DA616F8001209D -:10C64000BDE8F08194F8AA0180B16E7009202870CD -:10C6500020886880D4F8AE01D4F8B2116860A9606F -:10C66000B4F8B601A88184F8AA61E8E794F8B801A3 -:10C6700040B16E7017202870B4F8BA01688084F851 -:10C68000B861DCE794F8D40188B16E701820287086 -:10C6900094F8D4010028D2D084F8D461D4F8D6011B -:10C6A000C5F8020094F8D4010028F5D1C7E794F842 -:10C6B000BC01C8B16E701420287094F8BC01002829 -:10C6C000BDD000BF84F8BC61D4F8BE01C5F802003B -:10C6D000D4F8C201C5F80600B4F8C601688194F820 -:10C6E000BC010028EED1AAE794F8C80180B16E70B1 -:10C6F0001A20287084F8C861D4F8CA01C5F802006D -:10C70000D4F8CE01C5F80600B4F8D201688196E7E6 -:10C7100094F8DC0140B11B20287084F8DC61D4F867 -:10C72000DE01C5F802008AE794F8E201002808BF9C -:10C73000BDE8F0816E701520287094F8E2010028A1 -:10C740003FF47DAF84F8E261D4F8E401C5F802005B -:10C75000B4F8E801E88094F8E2010028F2D16EE72D -:10C7600024010020FA4A9060D1707047002180F8BF -:10C77000631080F8641080F8671090F8D61011B13B -:10C780000221FCF7E8BE0321FCF7E5BE2DE9F047E6 -:10C79000EF4C81460D46E0680088F4F77BFA06000E -:10C7A00008BFFFDF60782843607020794FF00005F4 -:10C7B00010F0200FE0681CBFA0F87C5080F8DC501F -:10C7C00004D1B0F87C10491CA0F87C10E068012767 -:10C7D00090F8691039B990F8642001230621583087 -:10C7E00002F0DFFE48B3A08810F4006F07D0E068C5 -:10C7F00090F86910002918BFA0F874501DD1E068A6 -:10C80000B0F87410491C89B2A0F87410B0F87630F2 -:10C810008B422CBF5A1A0022B4F806C00CF1050C4A -:10C82000624598BF80F87A70994206D3A0F8745098 -:10C8300080F8DA71E078EFF75DFA20794FF0020ABC -:10C8400010F0600F11D0E06890F8671011B1032963 -:10C8500006D00AE080F867700121FCF77CFE04E056 -:10C8600080F867A00121FCF776FEE06890F8671079 -:10C87000012905D1A18811F4807F18BF80F867A035 -:10C880004FF00808B9F1000F40F03281A18811F48F -:10C89000007F18BFA0F8F05004D1B0F8F020521C6F -:10C8A000A0F8F02011F0080F47D06178002944D19A -:10C8B00090F8C300FF2808BFFFDFFF21E06880F881 -:10C8C000C31090F86410192905D0E06890F863103F -:10C8D00020290FD028E080F88B5090F88A10491E4C -:10C8E00049B280F88A100029B8BFFFDFE06880F8FD -:10C8F0006450EAE790F8640002F046FE80B1E06818 -:10C900002621012380F8631090F864200B21583011 -:10C9100002F047FE002804BF2A20FEF7C9FF03E00B -:10C92000E168212081F86300E06890F8661008292A -:10C9300004BF84F800A080F86650FFF733F8207930 -:10C9400010F0040F09D0607838B9E06890F86610EC -:10C95000072904BF277080F8665000F0C5FB2079D6 -:10C9600010F0100F09D0607838B9E06890F86410C2 -:10C970000B2904BF0C2180F86410A07810F0080F78 -:10C9800011D0E0680123052190F86420583002F0AE -:10C9900008FE28B184F80180E06880F8A25102E026 -:10C9A000002001F07CFA00F03CFD01F06EFA002856 -:10C9B000E06818BFA0F8D05004D1B0F8D010491CDE -:10C9C000A0F8D01001F064FA40B1E16891F8DC0001 -:10C9D00002289CBF401C81F8DC0004D8E06890F875 -:10C9E000DC00022806D9E068A0F8D050A0F8D250A8 -:10C9F00080F8DC50E0680123002190F86420583072 -:10CA000002F0CFFD20B9E06890F864000C2859D1FD -:10CA1000E0680123002190F86320583002F0C1FD46 -:10CA200000284FD0E0680123002190F8662058309C -:10CA300002F0B7FDF0B3E06890F86710022904BF78 -:10CA400090F8DC0000283DD13046F3F70FFB88B3A7 -:10CA5000E06890F8C310FF2934D1B0F8CA1001295A -:10CA600030D980F8D570B0F87E10B0F87C208B1EDD -:10CA70009A42AFBF0121891A491E89B2B0F8D0305D -:10CA8000E28893422FBF0122D21A521C92B29142E5 -:10CA900088BF1146012908BF80F8D55090F8612160 -:10CAA000A2B1B0F8D220B0F8620182422CBF0120BE -:10CAB000801A00E006E03CBF401C80B2814288BF83 -:10CAC000014603E0E068012180F8D550E068B0F845 -:10CAD0005820114489B2A0F8CC1090F86730002B90 -:10CAE00018BF012B5FD0022B1CBF032BFFDF09D027 -:10CAF000A088C0F340200028E06818BFA0F8DE50EE -:10CB00005BD153E090F86630082B23D0B0F87C104E -:10CB1000B0F87E2000268B1C9A4206D3511A891E3B -:10CB20000E04360C1CBF711E8EB290F87A1051B1F3 -:10CB300090F8632001230921583002F032FD0028CB -:10CB400008BF00262BD0E06890F8691099B90AE078 -:10CB500024010020B0F87C30032B24D3B0F87E10E1 -:10CB60001144491C1FE090F864200123062158302D -:10CB700002F017FD78B1E1680020B1F87620B1F835 -:10CB800074108B1C9A4203D3501A801E18BF401E8B -:10CB9000B04238BF86B2002E1CBF701E86B2E0685D -:10CBA000B0F8CC103144A0F8C810A1E7B0F8DE10FE -:10CBB000B0F8CE201144A0F8DE10E06890F86611BD -:10CBC00039B990F8662001231946583002F0E9FC83 -:10CBD00038B1E068B0F88010B0F8CE201144A0F869 -:10CBE0008010E06890F8863033B1B0F88210B0F869 -:10CBF000CE201144A0F8821090F98AC0BCF1000F39 -:10CC000006DDB0F88810B0F8CE201144A0F88810E6 -:10CC10003D22B9F1000F18BF80F873204DD1217863 -:10CC2000022910D0012908BF90F8681143D061781B -:10CC300039B380F8727011F0140F18BF1E210CD098 -:10CC400080F8731055E090F8C410062905BF90F8DD -:10CC5000C3100229162106212DE011F0080F18BF7C -:10CC600080F8732045D111F0200F18BF2321E7D1A0 -:10CC700011F0030F08BFFFDF2A20E16881F873007D -:10CC800033E02BB1B0F88210B0F88420914211D279 -:10CC9000BCF1000F05DDB0F88810B0F88420914297 -:10CCA00008D2B0F88020B0F87E108A4208D390F8FD -:10CCB00066212AB1222180F8731080F8727018E082 -:10CCC00090F867203AB1B0F87C208A4228BF80F8FB -:10CCD0007380F2D209E0B0F87C10062905D33E211A -:10CCE00080F8731080F8727003E0E06890F87210BA -:10CCF00079B1E06880F8635080F8645080F867503C -:10CD000090F8D610002914BF02210321FCF723FC60 -:10CD100002E00021FCF71FFCE06880F8D650BDE877 -:10CD2000F047F8F7F0BBF949024648788B7818438A -:10CD30000ED10846C0684AB1097911F0080F03D036 -:10CD400090F86600082803D001207047FCF74FBB1D -:10CD5000002070472DE9F041EC4C05460E46A088B6 -:10CD60002843A08015F0020F04D015F0010F18BF62 -:10CD7000FFDF266115F0010F4FF000084FF00107AB -:10CD80001CD03046666103F01CF8062802D00B2840 -:10CD90000BD013E0E06890F8641017290ED1002141 -:10CDA000C0E9261180F8687008E0E06890F8641027 -:10CDB000112904BF80F8688080F88C7015F0020F8C -:10CDC00018D02069C078052802D00B280BD011E0BC -:10CDD000E06890F8641015290CD10021C0E92811F1 -:10CDE00080F8697006E0E06890F86410102908BFC8 -:10CDF00080F8698015F0800F1CBF0820A070BDE886 -:10CE0000F0812DE9F84FC14C00254FF00108A580B5 -:10CE10006570A5702570E06068F30709074680F823 -:10CE2000D6800088F3F736FF5FEA000A08BFFFDF0D -:10CE3000E0680088F8F72FFBE0680088F8F751FBFE -:10CE4000E068B0F8CA1071B190F8C310FF290FD193 -:10CE500090F8661191B190F8662001231946583078 -:10CE600002F09FFB98B1E06890F8C300FF2805D05E -:10CE7000E06890F8C30000BFFFF798FAD4F80CC040 -:10CE80009CF8D700002818BFE5801ED10FE0E068AD -:10CE9000A0F8805090F8671180F8C410002102209B -:10CEA000FFF76BFAE06880F8D5500220E4E79CF8C1 -:10CEB000960138B9BCF82000BCF80410884288BF3D -:10CEC000E08002D8BCF80400E080BCF8CE00401E30 -:10CED00086B2BCF8D0003044ACF8D0009CF8D40046 -:10CEE00000281CBFACF8D2508CF8D45004D1BCF848 -:10CEF000D2003044ACF8D200BCF87C003044ACF82E -:10CF00007C009CF8690040B99CF86420012306214C -:10CF10000CF1580002F045FB28B1E068B0F874103D -:10CF20003144A0F87410E068B0F8CA1001299CBF21 -:10CF3000491CA0F8CA10002E18BF80F8DC5090F8E9 -:10CF4000D510A1B1B0F8D000E18888420FD2504688 -:10CF5000F3F78CF858B1E06890F8611139B1B0F886 -:10CF6000D210B0F86201814228BF00F094FFE2685D -:10CF700082F8D55092F864000B2818BF0C2817D1FE -:10CF8000B2F85810B2F87C31C91A09B200290FDB87 -:10CF900002F5BF7102F1080004F053FF0221E068BE -:10CFA00001F0FEFEE06880F8645080F8968048E06A -:10CFB000252824D1B2F85800B2F87C11401A00B2EA -:10CFC00000281CDB92F8921192F87E01002808BF1D -:10CFD00092F8510082F8510092F87F01002808BFB2 -:10CFE00092F8520082F8520000291CBF0020FEF780 -:10CFF0005FFCE06880F8645080F87B5021E092F894 -:10D00000630025281DD1B2F85800B2F87C11401AEF -:10D0100000B2002815DB92F87E01002808BF92F8C4 -:10D02000510082F8510092F87F01002808BF92F861 -:10D03000520082F852000020FEF73AFCE06880F8C7 -:10D040006350E16801F15800B1F8CE2002F0B3F866 -:10D05000E06890F86111002918BFA0F8D2502C4860 -:10D0600000902C4B2C4A3946484600F053FEE068AD -:10D070000123052190F86420583002F092FA00282C -:10D0800008BFBDE8F88FBDE8F84F00F014BC00F011 -:10D09000E1BE10B50446B0F882214388B0F884118F -:10D0A000B0F886019A4201BFA3889942E38898426A -:10D0B0000FD02388A4F89A31A4F89C21A4F89E11DB -:10D0C000A4F8A001012084F896011048C078EEF77A -:10D0D00011FE0121204601F063FE002084F8640067 -:10D0E000032084F8670010BD70B5084C207910F05B -:10D0F000020F08BF70BD6078002818BF70BD20699E -:10D10000C178891E162980F06C8107E02401002077 -:10D110008DC7010027CD010055CD0100DFE801F0EA -:10D120000BF969758B1BF942F95BBE80F9F9F9F9C6 -:10D13000FAF7F6F5F4F3E0680123194690F8662053 -:10D14000583002F02EFA002818BF70BD0820E168A0 -:10D1500081F8660070BD02F0DFFEE16891F863209F -:10D160000A2A04BF91F8C220824205D1002081F82A -:10D17000630081F8860070BD91F8650010F0080F1B -:10D1800004BFFFDF70BD20F0080081F8650091F852 -:10D190008A00401E40B281F88A000028A8BF70BDF6 -:10D1A00000F0D8B8E06890F8650010F0010F08BFF3 -:10D1B000FFDFE16891F88A00401E40B281F88A00E2 -:10D1C0000028B8BFFFDFE06890F8651021F001018A -:10D1D00080F8651070BDE06890F86400102818BFF2 -:10D1E000FFDF0121E06880F88B10112180F86410C6 -:10D1F00070BDE06890F86400142818BFFFDF0121BB -:10D20000E06880F88B101521F0E7E06890F8640082 -:10D21000152818BFFFDF1720E16881F8640070BD92 -:10D22000E06890F86400152818BFFFDF1920E16856 -:10D2300081F8640070BDE06890F864001C2818BF95 -:10D24000FFDF0025E06880F88B5090F8A2010028ED -:10D2500018BFFFDFE06890F88C1041B180F88C5067 -:10D260000188A0F8A61180F8A4510D2108E00188DA -:10D27000A0F8A61180F8A451012180F8A8110C2172 -:10D2800080F8A2110088F3F7F3FCF3F753F9E07884 -:10D29000EEF730FDE06880F8645070BDE06890F80B -:10D2A0007A11042915D0E06890F8651011F0020F8A -:10D2B00008BF70BD90F88A10491E49B280F88A10E4 -:10D2C0000029B8BFFFDFE06890F8651021F0020187 -:10D2D0007EE790F8632001230021583002F061F9C5 -:10D2E000002808BFFFDFE06890F88E1011F0020FF1 -:10D2F00007BF062180F86310002180F8861018BF50 -:10D3000080F87A11CFE760E04FE035E024E011E0EB -:10D3100000E066E0E0680123002190F863205830C7 -:10D3200002F03FF9002808BFFFDF0E20E16881F816 -:10D33000630070BDE06890F8651021F0040180F88A -:10D34000651090F88A10491E49B280F88A100029A9 -:10D35000A8BF70BDFFDF70BDE0680123002190F819 -:10D360006320583002F01DF9002808BFFFDF1D20A0 -:10D37000E16881F8630070BDE06890F8650000F036 -:10D380003000102818BFFFDFE06890F8651021F02A -:10D39000100180F8651090F88A10491E49B280F893 -:10D3A0008A100029A8BF70BDD4E7E06801230021DE -:10D3B00090F86320583002F0F4F8002808BFFFDF2F -:10D3C0002020E16881F8630070BDE06890F8640097 -:10D3D00022281CBF0028FFDF2320E16881F86400B9 -:10D3E00070BDFFDF70BD10B5FE4CE16891F86500BF -:10D3F00010F0080F1EBF0120607010BD40F0080043 -:10D4000081F86500606902F0DCFCE16881F8C10028 -:10D410000020A1F8880091F88A00401C81F88A0059 -:10D4200010BD2DE9F041EF4CE06890F8C310FF29E2 -:10D4300006BF61780029BDE8F08190F866200123DD -:10D440001946583002F0ADF8002818BFBDE8F08149 -:10D45000E068002790F8661159B1A0F8807090F844 -:10D46000671180F8C410BDE8F04100210220FEF7EA -:10D4700084BF90F8642001230421583002F091F811 -:10D480005FEA00084FF002054FF001060CD0D4F817 -:10D490000CC09CF8640010287ED014287DD015287C -:10D4A0007CD01C287BD0E1E0E16891F8650010F0A9 -:10D4B000010F05D0BDE8F04101210920FEF75DBF55 -:10D4C00010F0020F0CD001210C20FEF756FFE0688F -:10D4D00090F88E1041F0010180F88E10BDE8F081C7 -:10D4E00010F0040F05D0BDE8F04101211320FEF734 -:10D4F00044BF10F0080F09D091F8C10081F8C400B2 -:10D50000BDE8F04101210720FEF737BF10F0100FF2 -:10D5100002D091F8890120B191F8640022287DD1D0 -:10D520009BE091F8880188B1B1F88A01A1F8400028 -:10D53000B1F88C01A1F84200B1F88E01A1F84400C5 -:10D54000B1F89001A1F8460081F88871FEF7E7F97B -:10D550000521E068FBF7FFFFE06890F84E10012915 -:10D5600008BF80F84E5014D00288A0F8BE21028E69 -:10D57000A0F8C021828EA0F8C221428E00F5CB71A6 -:10D58000A0F8C421C08E088681F82660E078EEF706 -:10D59000B1FB0121152003E006E00BE023E056E09B -:10D5A000BDE8F041FEF7E9BEBDE8F04101210B20E6 -:10D5B000FEF7E3BEF6F7D1FA0C2838BFBDE8F081DC -:10D5C0000821E068E830F6F7C9FA28B1E0680421DC -:10D5D000BC30F6F7C3FA00B9FFDFBDE8F041012126 -:10D5E0000420FEF7CABE9CF86901012817D0022862 -:10D5F00018BFBDE8F0819CF88C0000281CBF0620F5 -:10D600008CF8C4004FF0010114BF02200D20FEF77A -:10D61000B4FEE06880F86971BDE8F08126E09CF80E -:10D62000A201002818BFBDE8F0810CF1A803002278 -:10D630000CF1E0010CF5B57001F03BFF0121052074 -:10D64000FEF79BFEE06880F86971BDE8F081BDE8F7 -:10D65000F04101210620FEF790BE91F87B00C0B991 -:10D6600091F8920110B191F8930190B1E068012313 -:10D67000002190F86320583001F093FFC8B1E068B2 -:10D680000123042190F86420583001F08AFF30B162 -:10D690000FE0BDE8F04101211720FEF76EBEE06803 -:10D6A00090F87A0028B1BDE8F04100211220FEF781 -:10D6B00064BEE06890F863200A2A4DD0B8F1000FEC -:10D6C00018BFBDE8F08101230021583001F069FF47 -:10D6D00048B1E06890F87A11042904BF90F88E00F0 -:10D6E00010F0030F42D0E0680123002190F863207E -:10D6F000583001F056FF002808BFBDE8F081E0680F -:10D7000090F8881111B190F88911E1B390F8921155 -:10D71000002908BFBDE8F08190F89311002918BFD7 -:10D72000BDE8F08190F8642001230B21583001F00E -:10D7300038FF002818BFBDE8F081E06890F851205C -:10D7400090F89411012A71D0022A73D0042A14BFD0 -:10D75000082A042970D082E090F8C21080F8C41022 -:10D76000BDE8F04100210720FEF707BE00210C2094 -:10D77000FEF703FEE06890F88E1041F0010180F89A -:10D780008E10BDE8F081FFE7B0F88A11A0F84010D4 -:10D79000B0F88C11A0F84210B0F88E11A0F8441027 -:10D7A000B0F89011A0F8461080F8887190F86500E4 -:10D7B00010F0200F34D0FEF7B2F80521E068FBF737 -:10D7C000CAFEE06890F84E10012908BF80F84E505C -:10D7D00017D00288A0F8BE21028E00F5CB71A0F808 -:10D7E000C02101E024010020828EA0F8C221428ED7 -:10D7F000A0F8C421C08E088681F82660E078EEF794 -:10D8000079FA01211520FEF7B8FDE06890F865105F -:10D8100021F0200141F0100180F86510BDE8F08191 -:10D82000BDE8F04100211420FEF7A7BD012916D163 -:10D8300002E0FFE7022912D190F8522090F89511EA -:10D84000012A07D0022A08D0042A14BF082A042972 -:10D8500022D004E0012902D11EE002291CD090F858 -:10D86000642001230321583001F09BFE002818BFDB -:10D87000BDE8F081E0680123022190F8642058306F -:10D8800001F08FFE002818BFBDE8F0810021BDE83F -:10D89000F0411620FEF771BDBDE8F0410020FEF713 -:10D8A00007B8000030B5FF4C05462078002818BFA7 -:10D8B000FFDFA57230BDFB49012048727047FA486E -:10D8C00000B502784168406801F1580C91F8633066 -:10D8D00090F85100252B1CBF9CF80CC0BCF1250F03 -:10D8E00017D0202B18BF212B38D0BCF1230F18BF25 -:10D8F00000BD002A08BF00BD91F8942191F8501096 -:10D90000114011F0010F44D0082818BF04284CD052 -:10D910004EE08AB191F87E11002908BF00BD0828A9 -:10D9200018BF042841D0082918BF04293DD0012878 -:10D9300018BF01293CD036E091F8E810002908BF53 -:10D9400000BD082818BF04282FD0082918BF0429B3 -:10D950002BD0012818BF01292AD024E0BCF1230FC5 -:10D96000C7D0002A08BF00BD91F8941111F0010F33 -:10D9700004D0082818BF042817D019E011F0020FAE -:10D9800008BF00BD082818BF04280ED001280FD0FA -:10D9900009E011F0020F08BF00BD082818BF0428D5 -:10D9A00003D0012804D0022000BDFFDF082000BD05 -:10D9B000012000BD2DE9F14FBB4E4FF0010831466B -:10D9C0006FF00E0A4F686FF00D0B97F85210F88E3B -:10D9D00002290CBF0AEB90000BEBD00085B2788EC9 -:10D9E000A84238BF0546AF4C2946606BF2F77AFB78 -:10D9F000DFF8B892E06200281DBF0021A170A0628C -:10DA000084F8028008BFC4F8289030787068014616 -:10DA100000F1580890F86930428E91F85210C08E8B -:10DA200002290CBF0AEB90000BEBD00080B28242BF -:10DA300038BF1046002B1CBF001D80B2F6F756FE03 -:10DA400098F81100002838D008F15001974891E863 -:10DA50000E1000F5027A8AE80E10D8F86010C0F8AF -:10DA60002112D8F86410C0F8251200F58170F7F77C -:10DA7000B6F9307800280CBF0120002080F00101A9 -:10DA80008B480176D8E91212C0E90412C4F8289034 -:10DA90004946A581A0F58372F6F71BFD97F8520061 -:10DAA000012808BF002104D002281ABFFFDF00218F -:10DAB00001210120F6F71BFD04E0A06AF7F78FF9BA -:10DAC000F6F738FD009848B9012297F852309621B0 -:10DAD0001046F7F741F89620F7F7A9F997F82C00C8 -:10DAE000012808BFF7F726FA02202070BDE8F88F5A -:10DAF0002DE9F04FDFF8B08183B0414681464E6892 -:10DB0000A1F11400009096F85D004FF0000A012783 -:10DB100006F15804A1F1380570B3012873D002282A -:10DB200075D0032818BFFFDF7FD0686A082201780C -:10DB300021F008010170A37902EAC302114321F028 -:10DB400004010170E279042303EA8202114321F007 -:10DB50001001017094F805B0286BF2F795FA82462F -:10DB6000F7F7E3FCBBF1020F66D0BBF1010F67D002 -:10DB7000BBF1030F68D06CE0B6F834B0FFF79FFE3E -:10DB8000022819BF6FF00D0000EBDB006FF00E00F4 -:10DB900000EB9B0081B2308E884238BF0146ADF861 -:10DBA0000810A6F84C100098F7F79EFC38B1696A87 -:10DBB000EF70AA694FF48060904703201EE001AA2D -:10DBC00002A9286BF2F743F9686210B194F8331098 -:10DBD00021B10098F7F75CFC6771A6E79DF8041087 -:10DBE00031B9A0F800A080F802A0012102F03EF8AF -:10DBF000BDF80810686A02F01AFA0220607194E712 -:10DC000001E004E011E00098F7F742FC8DE7B6F878 -:10DC10004C00ADF8000001AA6946286BF2F717F92D -:10DC20006862002808BFFFDF7FE70098F7F75CFC19 -:10DC3000002808BFFFDF78E730EA0A0009D106E0D4 -:10DC400030EA0A0005D102E0BAF1000F01D001214B -:10DC500000E00021686A027842EA01110170217C2B -:10DC600000291CBF617901293CD004F150010F4803 -:10DC700091E80E1000F5027A8AE80E10216EC0F8C5 -:10DC80002112616EC0F8251200F58170F7F7A7F830 -:10DC900098F8000000280CBF0121002104480176FB -:10DCA00008E000003C01002074010020C00E0020AC -:10DCB000C8100020D4E91012C0E90412A0F5837145 -:10DCC0006A6AF6F706FC96F85100012808BF0021A1 -:10DCD00004D002281ABFFFDF002101210020F6F73F -:10DCE00006FC03E0F7F77BF8F6F724FCB9F1000F28 -:10DCF00006D196F85130012296210020F6F72CFF2C -:10DD0000AF71686A018829828078A8742F7003B087 -:10DD1000BDE8F08F2DE9F0471E46174681460C46B8 -:10DD2000FE4DDDF82080287828B9002F1CBF002E7A -:10DD3000B8F1000F00D1FFDFC5F82080C5E90E94CF -:10DD4000C5E9067600206872287268712871A8718A -:10DD5000E871F34EE870E881307804F158072088C4 -:10DD6000F2F798FF28632088F2F782FF6863F7F7DD -:10DD70002BF8F6F7DBFC04F11200F7F70EF804F1CC -:10DD80000E00F6F774FD307800280CBF0320012048 -:10DD9000F7F717F8787EF6F772FDF7F70CF830789A -:10DDA0006FF00E056FF00D09002830D0618EE08E07 -:10DDB00094F852407A7C022C0CBF05EB900009EBE2 -:10DDC000D00080B2814238BF0846002A1CBF001D27 -:10DDD00080B22146F6F78AFC3078002831D070688E -:10DDE00090F86001002818BFF6F7F2FC22460021E7 -:10DDF0000120F6F76DFE7068D0F8D800F6F7F2FF54 -:10DE00000120FFF7D7FDBDE8F047F6F7E5BF97F82B -:10DE10001080278EB4F834A0FFF751FD022814BFFC -:10DE200009EBDA0005EB9A0085B2AF4234BF384601 -:10DE30002846B8F1000F1CBF001D80B294F8514075 -:10DE4000C7E7002122460846F6F742FE0120FFF709 -:10DE50004FFED8E7B24810B501783838007831B1B4 -:10DE6000022818BFFFDFBDE81040F6F7ADBF01285C -:10DE700018BFFFDFF7E7A94810B50078022818BFE0 -:10DE8000FFDFBDE8104000F044BAA4488079704735 -:10DE9000A24840797047A1490120C87170472DE917 -:10DEA000F04706009E489D4D4FF0010740684FF037 -:10DEB000000800F15804A86A90F8019018BF012EDC -:10DEC00003D1696B03F0D0FA68706878A0B10128BB -:10DED00031D0022849D003281CBFFFDFBDE8F087FE -:10DEE000012E08BFBDE8F087686BF2F70CFBA87A3B -:10DEF000BDE8F047EDF7FEBE012E08D001224946ED -:10DF0000686BF2F74DF9022E08BFBDE8F087D4E93F -:10DF10001202411C42F10000C4E91210E07901280C -:10DF200003D100BF84F8078000E0E771A87ABDE85C -:10DF3000F047EDF7DFBE012E08D000224946686B9E -:10DF4000F2F72EF9022E08BFBDE8F087D4E91201DE -:10DF5000401C41F10001C4E91201E07901280CBF25 -:10DF600084F80780E771BDE8F087012E06D0686B62 -:10DF7000F2F7C9FA022E08BFBDE8F087D4E9120112 -:10DF8000401C41F10001C4E91201E0790128CCD123 -:10DF9000C8E72DE9F041624F4FF000083846A7F17D -:10DFA00038044068012600F158052078012818BF80 -:10DFB000FFDFA87850B185F80280E670A26941467B -:10DFC000042090473878002818BF2E71606A03211A -:10DFD000007831EA000004BFE878002805D1EE702F -:10DFE000616AE670A269022090470121002000F0DA -:10DFF000B1F918B1BDE8F04100F08BB9BDE8F041CE -:10E000000020D7E42DE9F84F454C83462046A4F183 -:10E0100038054068217800F1580A287800264FF02A -:10E020000109022818BFFFDFE88940F40070E88189 -:10E030002078676800283A48406890F868000090A7 -:10E040003C8EB7F83480FFF73AFC022807BF6FF028 -:10E050000E0000EB98006FF00D0000EBD80080B2CE -:10E06000844238BF2046009900291CBF001D80B2A1 -:10E0700097F85110F6F73AFB9AF81100BBF1000F30 -:10E0800000F0FA80F6F77CFAF6F76AFA90B99AF897 -:10E09000110078B1A86A417861B100789AF8071048 -:10E0A000C0F3C000884205D185F80490BDE8F84F60 -:10E0B00000F02FB9A86A1A4FB0460188A5F81310CE -:10E0C00080786875E88940F02000E8816E713878C2 -:10E0D0007868583000907C6894F82C00012818D19A -:10E0E000F6F71EFF2046009901F023FA88B1387830 -:10E0F000002878680CBF00F5867000F5EA7021886A -:10E1000041800099097A017180F80090A87AEDF7B2 -:10E11000F1FDA86A0078C0F3800003E03C01002014 -:10E12000740100209AF80610884237D03878786851 -:10E1300000F1580490F85D0060B3022848D000BF99 -:10E1400084F80580387840B12079414628B12171A2 -:10E1500085F80390AA6910209047E07898B184F878 -:10E160000380F7F7D0F9002808BFFFDF082085F803 -:10E170000390AA6900219047D4E91002411C42F1A2 -:10E180000000C4E91010A07901280CBF84F80680B3 -:10E1900084F80690E88940F48070E881A86A9AF8CB -:10E1A00007300178C1F3C0029A4252D13A787A68B6 -:10E1B00001F0030102F15804012918BF022935D0EA -:10E1C00003291CBF287A40F0040012D0287240E0D6 -:10E1D000286BF1F776FE002808BFFFDFD4E91002B4 -:10E1E000411C42F10000C4E91010A87AEDF782FD4D -:10E1F000A6E701F05CFDA8B184F80290E9894846E1 -:10E2000041F40061E981A96A85F80390AA69904701 -:10E21000E079012803D100BF84F8078019E084F871 -:10E22000079016E0287A40F01000CFE74078F8B168 -:10E23000E98941F40061E981A97851B9FB28F1D855 -:10E24000687A002808BF4E4603D08020AA690021C2 -:10E2500090475946012000F07DF858B39AF8110014 -:10E26000002818BFBBF1000F1BD0A87868B118E0D8 -:10E27000E0790128D3D1CFE7002818BFF6F7B9F924 -:10E28000E88940F04000E881E3E7A96AAA89487874 -:10E29000904288BF1046C21CE86A03F02DFCE86A71 -:10E2A000A862002E1CBF0020FFF7F9FDBDE8F84F63 -:10E2B00000F02FB8002E1CBF0120FFF7F0FD00205A -:10E2C000FFF716FC9AF81100002818BFBBF1000FE9 -:10E2D0000DD0A87858B9A96AAA894878904288BF11 -:10E2E0001046C21CE86A03F007FCE86AA862002E28 -:10E2F00008BFBDE8F88F0220BDE8F84FCFE5354AEA -:10E300001378526892F851200BB1FBF76ABAFAF70A -:10E310001AB970B52F4900254C68F6F7B7FDF6F726 -:10E32000A9FDF6F7DBFCF6F73EFDF6F703F9F6F785 -:10E3300053FD94F82C00012808BFF6F7F1FD264C98 -:10E340000021A269E0899047226A217A20799047CA -:10E35000257070BD70B5204C0546002908BF012D01 -:10E3600005D16079401CC0B26071012830D8E169E4 -:10E370002846884700282BD0E179184839B1012D6B -:10E3800001BF41780029017811F0100F20D0217AC7 -:10E39000F1B910490978002918BF002102D029439A -:10E3A00004D013E0012D18BF0121F8D10C490978E0 -:10E3B00011F0100F04BF007810F0100F08D0E078B3 -:10E3C00030B9A07810B111F0100F01D0002070BD4D -:10E3D000012070BD740100203C0100204F0100208D -:10E3E0004C01002010B540F2C311F94803F0FBFBCB -:10E3F000FF220821F748E4F7FAFDF74800214170B1 -:10E400004FF46171418010BD2DE9F0410F46064681 -:10E4100000F03FFBEE4C102817D004EBC00191F840 -:10E420004A1111F0010F1CBF0120BDE8F081617895 -:10E4300008291FD2617804EBC000491C61700121DA -:10E4400080F84A110846BDE8F0816178082911D2A8 -:10E450002578681C207004EBC5083868C8F84401AA -:10E46000B888A8F84801102D28BFFFDF88F843615D -:10E470002846DFE70020BDE8F081D5480178491E35 -:10E480004BB2002BB8BF704770B4002500EBC3013E -:10E4900091F84A1111F0010F3BD04278D9B2521EC7 -:10E4A000427000EBC10282F84A5190F802C000228B -:10E4B000BCF1000F0BD9841894F803618E4202D18D -:10E4C000102A26D103E0521CD2B29445F3D8027828 -:10E4D000521ED2B202708A421BD000EBC20200EB85 -:10E4E000C10CD2F84341CCF84341D2F84721CCF8D3 -:10E4F0004721847890F800C00022002C09D98618A2 -:10E5000096F8036166450AD1102A1CBF024482F8BE -:10E510000311591E4BB2002BB8DA70BC7047521C65 -:10E52000D2B29442EBD8F4E72DE9F0471F4690466B -:10E530000E46814600F0ADFAA54C0546102830D0B5 -:10E54000A2780021002A0ED9631893F80331834280 -:10E5500005D110291CBF1220BDE8F08703E0491C3B -:10E56000C9B28A42F0D8082A2FD2102D1CD0A67822 -:10E570001022701CA07004EB061909F1030041463B -:10E5800000F086FF09F183001022394600F080FF79 -:10E59000A019002180F8035180F83B110846BDE81E -:10E5A000F087A278082A10D22578681C207004EB26 -:10E5B000C50A3068CAF84401B088AAF84801102D8D -:10E5C00028BFFFDF8AF84391D1E70720BDE8F08735 -:10E5D00070B47F488178491E4BB2002BBCBF70BC21 -:10E5E000704700BF817803F0FF0C491ECAB28270E9 -:10E5F00050FA83F191F8031194453ED000EB0215D7 -:10E6000000EB0C14D5F80360C4F80360D5F807607C -:10E61000C4F80760D5F80B60C4F80B60D5F80F603C -:10E62000C4F80F60D5F88360C4F88360D5F88760BC -:10E63000C4F88760D5F88B60C4F88B60D5F88F502C -:10E64000C4F88F50851800EB0C0402EB420295F8D9 -:10E6500003610CEB4C0C00EB420284F8036100EB0D -:10E660004C0CD2F80B61CCF80B61B2F80F21ACF86E -:10E670000F2195F83B2184F83B2100EBC10292F871 -:10E680004A2112F0010F33D190F802C00022BCF1F0 -:10E69000000F0BD9841894F803518D4202D1102A2F -:10E6A00026D103E0521CD2B29445F3D80278521E10 -:10E6B000D2B202708A421BD000EBC20200EBC10C46 -:10E6C000D2F84341CCF84341D2F84721CCF8472156 -:10E6D000847890F800C00022002C09D9851895F89C -:10E6E000035165450BD1102A1CBF024482F8031167 -:10E6F000591E4BB2002BBFF675AF70BC7047521C51 -:10E70000D2B29442EAD8F3E73349487070473248AE -:10E710004078704738B14AF2B811884203D82E4980 -:10E72000488001207047002070472B484088704780 -:10E7300010B500F0AEF9102814D0254A014600208B -:10E7400092F802C0BCF1000F0CD9131893F80331F2 -:10E750008B4203D1102818BF10BD03E0401CC0B28B -:10E760008445F2D8082010BD19498A78824286BFB4 -:10E7700001EB001083300020704715498A788242EF -:10E7800086BF01EB0010C01C00207047104B93F8AF -:10E7900002C084459CBF00207047184490F80301D4 -:10E7A00003EBC00090F843310B70D0F844111160B6 -:10E7B000B0F84801908001207047054A114491F853 -:10E7C000032105490A7002684A6080880881704701 -:10E7D000F0100020860100207C01002010B5F5F724 -:10E7E00027FE002804BFFF2010BDBDE81040F5F74C -:10E7F00045BEFE498A7882429CBF0020704708448B -:10E8000090F8030101EBC00090F84A0100F001000C -:10E8100070472DE9F047F54F0026B04638780028BC -:10E8200086BF4FF0080ADFF8C893BDE8F08700BF45 -:10E8300007EBC80505F5A27195F8430100F029F929 -:10E84000102808BF544610D0B978002400290BD9ED -:10E850003A1992F80321824202D1102C05D103E02B -:10E86000621CD4B2A142F3D80824B878A04286BF73 -:10E8700007EB0410C01C002095F84A1111F0010F9D -:10E8800016D050B1082C04D2391991F83B11012946 -:10E8900003D0102100F0D9FD50B109F806403046F0 -:10E8A000731C95F8432105F5A271DEB2F5F7A8FFB8 -:10E8B00008F1010000F0FF0838784045B8D8BDE8FD -:10E8C000F0872DE9F041C94C00263546A078002894 -:10E8D0008CBFC74FBDE8F0816119C0B291F80381C8 -:10E8E000A84286BF04EB0510C01C002091F83B1124 -:10E8F000012903D0102100F0A8FD58B104EBC80095 -:10E90000BD5590F8432100F5A2713046731CDEB26C -:10E91000F5F776FF681CC5B2A078A842DCD8BDE840 -:10E92000F08110B5F5F79BFF002804BF082010BD4B -:10E93000F5F799FFAE49085C10BDAE4910B54978AE -:10E9400041B1AA4B997829B1C21CD81CF5F70DFD2D -:10E95000012010BD002010BDA44A01EB410102EBD3 -:10E9600041010268C1F80B218088A1F80F017047AE -:10E970002DE9F0419D4D07460024A878002898BF56 -:10E98000BDE8F081C0B2A04213D905EB041010F12C -:10E9900083060ED01021304600F057FD48B904EB35 -:10E9A000440005EB400000F20B113A463046F6F702 -:10E9B0003AFE601CC4B2A878A042E3D8BDE8F0815A -:10E9C000014610228C4800F063BD8B48704770B53B -:10E9D000864D0446A878A04206D905EB0410102104 -:10E9E000833000F032FD08B1002070BD04EB44001C -:10E9F00005EB400000F20B1070BD7C498A78824222 -:10EA000006D9084490F83B01002804BF0120704754 -:10EA1000002070472DE9F0410E46074615460621B5 -:10EA2000304600F012FD714C98B1A17871B104F537 -:10EA30009D7011F0010F18BF00F8015FA17849081F -:10EA400004D0457000F8025F491EFAD10120BDE8EC -:10EA5000F0813846314600F01CF8102816D0A37813 -:10EA60000021002B12D9621892F80321824209D1A9 -:10EA7000102918BF082909D0601880F83B510120DF -:10EA8000BDE8F081491CC9B28B42ECD80020BDE83A -:10EA9000F0812DE9F041554D0646002428780F46B7 -:10EAA000002811D905EBC40090F84311B14206D1FA -:10EAB0000622394600F5A27002F0F2FF38B1601C60 -:10EAC000C4B22878A042EDD81020BDE8F0812046DD -:10EAD000BDE8F081454910B44A7801EBC003521EED -:10EAE0004A70002283F84A2191F802C0BCF1000F5D -:10EAF0000DD98B1893F80341844204D1102A1CBF0E -:10EB000010BC704703E0521CD2B29445F1D80A7889 -:10EB1000521ED2B20A70824204BF10BC704701EB91 -:10EB2000C00301EBC202D2F843C1C3F843C1D2F81B -:10EB30004721C3F847218C7891F800C00022002CAF -:10EB40009CBF10BC70478B1893F80331634506D106 -:10EB5000102A1CBF114481F8030110BC7047521CDD -:10EB6000D2B29442EFD810BC704770B41F490D1850 -:10EB70008A78521ED3B28B7095F80321984247D001 -:10EB800001EB001401EB031C00EB4000DCF8036018 -:10EB9000C4F80360DCF80760C4F80760DCF80B60B9 -:10EBA000C4F80B60DCF80F60C4F80F60DCF8836019 -:10EBB000C4F88360DCF88760C4F88760DCF88B6099 -:10EBC000C4F88B60DCF88FC0C4F88FC001EB030C75 -:10EBD00003EB43039CF8034101EB430385F8034136 -:10EBE00001EB4000D3F80B4108E00000F0100020DA -:10EBF000860100207C010020B3120020C0F80B41E8 -:10EC0000B3F80F31A0F80F319CF83B0185F83B01B8 -:10EC100001EBC20090F84A0110F0010F1CBF70BC5C -:10EC2000704700208C78002C0DD90B1893F803C185 -:10EC3000944504D110281CBF70BC704703E0401CF1 -:10EC4000C0B28442F1D80878401EC0B20870904229 -:10EC500004BF70BC704701EBC20301EBC000D0F8E9 -:10EC600043C1C3F843C1D0F84701C3F847018C78CA -:10EC70000B780020002C9CBF70BC704701EB000C8F -:10EC80009CF803C19C4506D110281CBF084480F89D -:10EC9000032170BC7047401CC0B28442EED870BCE7 -:10ECA0007047000010B50A7B02F01F020A730022B1 -:10ECB000C2758B181B7A03F0010C5B0803F001048A -:10ECC000A4445B0803F00104A4445B0803F00104BE -:10ECD000A4445B0803F0010464444FEA530C0CF0B5 -:10ECE000010323444FEA5C0C0CF00104234403EBC2 -:10ECF0005C0300EB020C521C8CF8123090F817C029 -:10ED0000D2B26344C375052AD3D3D8B2252888BFAD -:10ED1000FFDF10BD00238383028401EBC202521E79 -:10ED2000B2FBF1F1C183704770B46FF01F02010CA8 -:10ED300002EA90251F23A1F5AA4054381CBFA1F573 -:10ED4000AA40B0F1550009D0A1F52850AA381EBF3D -:10ED5000A1F52A40B0F1AA00012000D100204FF017 -:10ED6000000C62464FEA0C048CEA0106F643164397 -:10ED7000B6F1FF3F11D005F001064FEA5C0C4CEAFA -:10ED8000C63C03F0010652086D085B08641C42EAA9 -:10ED9000C632162CE8D370BC704770BC0020704798 -:10EDA0002DE9F04701270025044603290FD04FF431 -:10EDB000FA43002972D0012900F0F880022918BF17 -:10EDC000BDE8F0870146BDE8F04758306AE704F136 -:10EDD00058067021304602F028FFB571F571F572C2 -:10EDE0003573B573F573757135767576F52086F8DC -:10EDF0003C00412086F83D00FF2086F86B00A4F817 -:10EE0000C850A4F8CA50A4F8CC50A4F8CE50A4F826 -:10EE1000D050A4F8D25084F8D55084F8D750A4F834 -:10EE2000DE5084F8DC50A4F8F050A4F8F25084F8D6 -:10EE30002C50258484F8517084F852704FF4486047 -:10EE400060801B21218761874FF4A470E087A08731 -:10EE500021866186E086A086A4F84410A4F84600C6 -:10EE6000A4F84010A4F84200A4F84810A4F84A10EE -:10EE7000A4F84C10677384F8885184F8895184F899 -:10EE8000925184F8935184F8615184F8665184F862 -:10EE9000695184F87A51BDE8F087FFE7A4F8DE50A5 -:10EEA00084F8D6506088FE490144B1FBF0F1A4F823 -:10EEB00076104BF68031A4F87810E288A4F87C50E4 -:10EEC000B4F880C0D2000CFB00FCB2FBF0F29CFB5B -:10EED000F0FC521CA4F880C092B202FB00FC04F1CA -:10EEE0005801A4F87E20BCF5C84FC4BF521ECA8486 -:10EEF000B3FBF0F2521C8A8500F5802202F5EE3257 -:10EF0000531EB3FBF0F2CA838B8B03FB00F2B2FB00 -:10EF1000F0F08883214604F15800FFF7C3FED4F8CF -:10EF20000E106FF01F02080C02EA9126A0F5AA410C -:10EF30004FF01F0C54391CBFA0F5AA41B1F1550187 -:10EF40000AD0A0F52851AA391EBFA0F52A41B1F177 -:10EF5000AA014FF0010901D14FF00009002211462A -:10EF60004FEA020382EA00086FEA080848EA01084B -:10EF7000B8F1FF3F16D006F00108520842EAC83245 -:10EF800049080CF0010876085B1C41EAC8314FEAD9 -:10EF90005C0C162BE6D3B9F1000F1CBF84F860514E -:10EFA000BDE8F08784F86071BDE8F087A4F8DE5012 -:10EFB000B4F88221B4F88611B4F802C004F1580004 -:10EFC000A4F87C50B4F88040C90004FB0CF4B1FBF9 -:10EFD000F2F194FBF2F4491C048589B201FB02F4BE -:10EFE000C184B4F5C84FC4BF491EC184B3FBF2F15C -:10EFF000491C8185018C02EBC101491EB1FBF2F174 -:10F00000C183818B01FB0CF1B1FBF2F18183BDE87F -:10F01000F08770B50025044603290DD04FF4FA425D -:10F02000002958D001297DD0022918BF70BD0146A2 -:10F03000BDE87040583035E604F15806702130467E -:10F0400002F0F3FDB571F571F5723573B573F573B3 -:10F05000757135767576F52086F83C00412086F886 -:10F060003D00FF2086F86B00A4F8D050202084F8E3 -:10F07000D20084F8C850C4F8CC50012284F82C5037 -:10F0800084F8512084F852201B20208760874FF499 -:10F09000A471E187A18720866086E186A186A4F815 -:10F0A0004400A4F84610A4F84000A4F84210A4F8C4 -:10F0B0004800A4F84A00A4F84C00627384F8FC509D -:10F0C00084F8FD5084F8065184F8075184F8EC5018 -:10F0D00084F8F85070BD608871490144B1FBF0F1CB -:10F0E000A4F876104BF68031A4F87810E388A4F8E1 -:10F0F0007C50B4F880C0DB000CFB00FCB3FBF0F3E9 -:10F100009CFBF0FC5B1CA4F880C09BB203FB00FCE2 -:10F1100004F15801A4F87E30BCF5C84FC4BF5B1E93 -:10F12000CB8400E017E0B2FBF0F2521C8A8500F5B8 -:10F13000802202F5EE32531EB3FBF0F2CA838B8BB2 -:10F1400003FB00F2B2FBF0F08883214604F1580083 -:10F15000BDE87040A6E5D4F8F030B4F802C004F180 -:10F1600058005989DB89A4F87C50B4F88040DB0052 -:10F1700004FB0CF4B3FBF1F394FBF1F45B1C04858A -:10F180009BB203FB01F4C384B4F5C84FC4BF5B1E3C -:10F19000C384B2FBF1F2521C8285028C01EBC202E5 -:10F1A000521EB2FBF1F2C283828B02FB0CF2B2FB65 -:10F1B000F1F1818370BD2DE9F003C47D0CB1252CE4 -:10F1C00003D9BDE8F00312207047002A02BF0020D7 -:10F1D000BDE8F003704791F80DC01F260123314DA3 -:10F1E0004FF00008BCF1000F7AD0BCF1010F1EBF38 -:10F1F0001F20BDE8F0037047B0F800C00A7C8F7B89 -:10F2000091F80F907A404F7C87EA090742EA07227B -:10F2100082EA0C0C5FF000070CF0FF094FEA1C2C8F -:10F2200099FAA9F99CFAACFC4FEA19694FEA1C6CEF -:10F2300049EA0C2C0CEB0C1C7F1C9444FFB21FFA07 -:10F240008CFC032FE8D38CEA020C164F0022ECFB57 -:10F25000057212096FF0240502FB05C2D2B201EB60 -:10F26000D207027602F007053F7A03FA05F52F422E -:10F2700018BF42767ED104FB0CF2120C521CD2B2A3 -:10F280005FF0000400EB040C9CF812C094453CBFF6 -:10F29000A2EB0C02D2B218D34FF0000C0D1903E010 -:10F2A000FFDB050053E4B36E95F8085003FA0CF742 -:10F2B0003D421CBF521ED2B2002A6AD00CF1010C92 -:10F2C0000CF0FF0CBCF1080FF0D304F1010C0CF0B2 -:10F2D000FF04052CD6D33046BDE8F0037047FFE7A6 -:10F2E00090F818C00C7E474604FB02C2FB4C4FF05E -:10F2F000000CE2FB054C4FEA1C1C6FF024040CFBD5 -:10F300000422D2B201EBD204027602F0070C247A76 -:10F3100003FA0CFC14EA0C0F1FBF42764046BDE80E -:10F32000F003704790F817C0B2FBFCF40CFB1422FA -:10F33000521CD2B25FF0000400EB040C9CF812C027 -:10F3400094453CBFA2EB0C02D2B212D30D194FF080 -:10F35000000C2D7A03FA0CF815EA080F1CBF521E98 -:10F36000D2B27AB10CF1010C0CF0FF0CBCF1080F19 -:10F37000F0D300E010E004F1010C0CF0FF04052CC8 -:10F38000DAD3A8E70CEBC40141763846BDE8F003B8 -:10F3900070470CEBC40141764046BDE8F00370476E -:10F3A000CF4A016812681140CE4A126811430160C9 -:10F3B000704730B4CC49CA4B00244FF0010C0A7896 -:10F3C000521CD2B20A70202A08BF0C700D781A683D -:10F3D0000CFA05F52A42F2D0097802680CFA01F11C -:10F3E0005140016030BC7047017931F01F0113BFFB -:10F3F000002000221146704710B4435C491C03F002 -:10F40000010C5B0803F00104A4445B0803F0010451 -:10F41000A4445B0803F00104A4445B0803F0010466 -:10F42000A4445B0803F001045B08A44403F0010456 -:10F43000A4440CEB53031A44D2B20529DDDB012AA4 -:10F440008CBF0120002010BC704730B40022A1F115 -:10F45000010CBCF1000F11DD431E11F0010F08BFBC -:10F4600013F8012F5C785FEA6C0C07D013F8025F89 -:10F4700022435C782A43BCF1010CF7D1491E5CBFE2 -:10F48000405C0243002A0CBF0120002030BC7047C2 -:10F49000130008BF704710B401EB030CD41A1CF81A -:10F4A00001CC5B1E00F804C013F0FF03F4D110BCC4 -:10F4B0007047F0B58DB0164610251C466A46AC461E -:10F4C00000EB0C03A5EB0C0713F8013CD355ACF192 -:10F4D000010313F0FF0CF3D11546103210208446BF -:10F4E0000B18ACEB000713F8013C401ED35510F08D -:10F4F000FF00F5D1284601F033FA86B1102005F15E -:10F50000200201461318A1EB000C13F8013C401E29 -:10F5100004F80C3010F0FF00F4D10DB0F0BD0898E5 -:10F520002060099860600A98A0600B98E0600DB0B8 -:10F53000F0BD38B505460C466846F5F706FD0028CF -:10F5400008BF38BD9DF90020227294F909100020EF -:10F55000511A48BF494295F82D308B42C8BF38BD7B -:10F56000FF2B08BF38BDA17A491CC9B2A17295F81A -:10F570002E30994203D8617A7F2918BF38BD627254 -:10F580000020A072012038BD0C2818BF0B2806D01F -:10F590000D281CBF2038062884BF0020704701209A -:10F5A00070470C295AD2DFE801F006090E13161B2A -:10F5B000323C4153484E002A52D04FE0072A18BF30 -:10F5C000082A4DD04AE00C2A18BF0B2A48D045E043 -:10F5D0000D2A45D042E0A2F10F000D2840D93DE0B0 -:10F5E00023B1A2F110000C283AD937E0122A18BF33 -:10F5F000112A35D090F8340020B1122A2ED31B2ABC -:10F600002ED92BE0162A29D31B2A29D926E0A2F1CC -:10F610000F01032924D990F83400F8B11C2A1FD90E -:10F620001CE0002B08BF042A18D119E013B1062AE8 -:10F6300016D013E0012A11D112E01D2A1CBF1E2A88 -:10F640001F2A0DD00AE0A2F12000062808D905E003 -:10F6500013B10E2A04D001E0052A01D00020704722 -:10F66000012070472DE9F04187680D460446204689 -:10F67000F3F7CCFB98B1D5B13846A168F3F709FF91 -:10F68000002814DD2844401EB0FBF5F606FB05F10A -:10F690003846F2F7F8FEA0603046BDE8F081F3F797 -:10F6A000E7F94FF4E661F2F7EEFEA060DFE7002035 -:10F6B000BDE8F081904228BF704770B50446101B2A -:10F6C000642838BF642025188D4205D8F3F715FF4C -:10F6D00000281CBF284670BD204670BD53E4B36EA1 -:10F6E00064230200682302008E01002091F851304B -:10F6F0000A8E022B07BF92003C32D200703292B2C7 -:10F700008B8E934238BF1A464B8E91F852C0BCF193 -:10F71000020F07BF9B003C33DB0070339BB2C98EE6 -:10F72000994238BF0B4600280CBF01210021D01898 -:10F730009830002918BF04210844704730B48388EA -:10F74000B0F808C003EB0C049834002A18BF042258 -:10F7500022444C6A944224BF30BC7047121B521C96 -:10F7600052089B1A9BB2ACEB0202838092B20281D8 -:10F7700091F851506FF00E0C6FF00D04022D0CBF7C -:10F780000CEB930304EBD303438091F8521002294E -:10F790000CBF0CEB920104EBD201C18030BC70476E -:10F7A00010F0010F1CBF0120704710F0020F1CBFAA -:10F7B0000220704710F0040018BF082070472DE9A0 -:10F7C000F0410546174688460126084600F001FC30 -:10F7D0000446404600F001FC034610F0010F18BF3C -:10F7E000012008D113F0020F18BF022003D113F03B -:10F7F000040018BF082014F0010F18BF4FF0010CCF -:10F8000021D000BF50EA0C0108BF002613F0030FFF -:10F8100008BF002014F0030F08BF4FF0000C95F84C -:10F820005110814208BF0020387095F85210614590 -:10F8300008BF4FF0000C87F801C0002808BFBCF1DA -:10F84000000F1CD10DE014F0020F18BF4FF0020C96 -:10F85000D8D114F0040F14BF4FF0080C4FF0000C77 -:10F86000D0E7404600F0BFFBB5F85810401A00B290 -:10F8700047F6FE71884201DC002800DC0026304695 -:10F88000BDE8F08101281CBF02280020704718B491 -:10F89000CBB2C1F3072CC1B2C0F30720012B07D0B4 -:10F8A000022B09D0042B08BFBCF1040F23D006E0C3 -:10F8B000BCF1010F03D11EE0BCF1020F1BD00129E6 -:10F8C00006D0022907D0042908BF042813D004E079 -:10F8D000012802D10FE002280DD001EA0C0161F3EA -:10F8E0000702184060F30F22D0B210F0020F18BFC9 -:10F8F00002200BD106E0084003EA0C01084060F347 -:10F900000702EFE710F0010018BF01208DF800009A -:10F91000C2F3072010F0020F18BF022003D110F02D -:10F92000010018BF01208DF80100BDF8000018BCCF -:10F930007047162A10D12A220C2818BF0D280FD084 -:10F940004FF0230C20280DD031B10878012818BFC2 -:10F95000002805D0162805D00020704701207047E8 -:10F960001A70FBE783F800C0F8E70000282102F0D6 -:10F970003AB930B50546007801F00F0220F00F00CB -:10F980001043287007290BD2DFE801F004060406B3 -:10F9900004080400062405E00C2403E0222401E00E -:10F9A0000024FFDF687820F03F002043687030BDFE -:10F9B000007800F00F0070470A68C0F803208988BB -:10F9C000A0F807107047D0F803200A60B0F80700CD -:10F9D000888070470A68C0F809208988A0F80D104F -:10F9E0007047D0F809200A60B0F80D008880704791 -:10F9F0000278202322F0200203EA41111143017012 -:10FA000070470278402322F0400203EA811111433B -:10FA1000017070470078C0F380107047027880232F -:10FA200022F0800203EAC11111430170704700788F -:10FA3000C0097047D0F80320C1F80920B0F80720AA -:10FA4000A1F80D200A7822F080020A70007880095F -:10FA500042EAC0100870704770B515460E4604465D -:10FA60001F2A88BFFFDF2A46314604F1090002F051 -:10FA700043F86078A91D20F03F0001F03F010843E2 -:10FA8000607070BD70B5054640780E4600F03F04CA -:10FA9000062C38BFFFDFA01FC4B21F2C88BF1F2455 -:10FAA000224605F10901304602F026F8204670BDD5 -:10FAB00070B515460E4604461F2A88BFFFDF2A464A -:10FAC000314604F1090002F017F86078A91D20F012 -:10FAD0003F0001F03F010843607070BD70B50546FE -:10FAE00040780E4600F03F04062C38BFFFDFA01F11 -:10FAF000C4B21F2C88BFFFDF224605F10901304642 -:10FB000001F0FAFF204670BD0968C0F80F10704779 -:10FB10000A88A0F813208978417570474176090A50 -:10FB200081767047C176090A017770474177090AE3 -:10FB300081777047C175090A0176704781757047F2 -:10FB400090F8242001F01F0122F01F02114380F8D9 -:10FB500024107047072988BF072190F82420E0234C -:10FB600022F0E00203EA4111114380F824107047AB -:10FB70001F3002F066B94178007801F03F0110F0C3 -:10FB80000F0006D0012808D0022809D006280BD083 -:10FB90000FE0881F1F280AD90BE00C2909D106E0C5 -:10FBA000881F1F2803D904E0881F1F2801D80120BF -:10FBB0007047002070474178007801F03F0100F065 -:10FBC0000F00042805D1062903D325299CBF012055 -:10FBD00070470020704710B4017801F00F0103292D -:10FBE00022D0052925D14478B0F81910B0F81BC0EF -:10FBF000B0F81730827D04F03F04222C19D1062979 -:10FC000017D3B1F5486F98BFBCF5FA7F11D282B116 -:10FC1000082A98BF8A420CD28B429CBFB0F81D00C4 -:10FC2000B0F5486F05D807E0407800F03F000C2899 -:10FC300002D010BC0020704710BC01207047222168 -:10FC400001F0D1BF00B5027801F0030322F00302F6 -:10FC50001A43027000224270012914BF022900BD1C -:10FC6000032912BFFFDF0121417000BD01F0030332 -:10FC700000B5027822F003021A430270002242709B -:10FC8000012914BF022900BD032912BFFFDF012192 -:10FC9000417000BD007800F0030070470278102327 -:10FCA00022F0100203EA01111143017070474178FC -:10FCB000F9B1C078192850D2DFE800F00D10131602 -:10FCC000191C1F2225282B2E31344F4F4F4C373A09 -:10FCD0003D40434649000C2941D042E008293ED02E -:10FCE0003FE002293BD03CE0172938D039E00D290C -:10FCF00035D036E0012932D033E001292FD030E071 -:10FD000002292CD02DE0092929D02AE0092926D062 -:10FD100027E0012923D024E0012920D021E0062971 -:10FD20001DD01EE002291AD01BE0012917D018E0CF -:10FD3000012914D015E0092911D012E009290ED0AB -:10FD40000FE003290BD00CE0032908D009E00529B6 -:10FD500005D006E0032902D003E0FB2901D80120E9 -:10FD600070470020704730B50546C170192924D26C -:10FD7000DFE801F00D0F11131517171119191717D7 -:10FD80001B111921211D171719191D1D1F000C24E6 -:10FD900015E0082413E0022411E017240FE00D24DD -:10FDA0000DE001240BE0092409E0062407E0032408 -:10FDB00005E0052403E0182401E00024FFDF6C7057 -:10FDC00030BDC0787047C171090A01727047B0F840 -:10FDD000070070474172090A81727047B0F8090044 -:10FDE0007047C172090A01737047B0F80B00704781 -:10FDF0004171090A81717047B0F8050070470171BF -:10FE00007047007970474173090A81737047B0F8F1 -:10FE10000D00704730B4B0F80720894DB0F809C024 -:10FE2000B0F805300179941F2D1998BFBCF5FA7F01 -:10FE30000ED269B1082998BF914209D293429FBF5F -:10FE4000B0F80B00B0F5486F012030BC98BF704788 -:10FE5000002030BC7047001D01F0F3BF021D0846B2 -:10FE6000114601F0EEBF4172090A81727047B0F885 -:10FE70000900704701717047007970470A68426055 -:10FE800049688160704742680A60806848607047CE -:10FE90000988818170478089088070470A68C0F8A6 -:10FEA0000E204968C0F812107047D0F80E200A6082 -:10FEB000D0F81200486070470968C0F81610704703 -:10FEC000D0F81600086070470A684260496881608F -:10FED000704742680A608068486070470968C1607E -:10FEE0007047C06808607047017170474171090A26 -:10FEF00081717047C171090A0172704700797047BA -:10FF0000B0F805007047B0F80700704701717047FE -:10FF10000079704701717047007970470A68426044 -:10FF200049688160704742680A608068486070472D -:10FF30000171090A417170478171090AC1717047E5 -:10FF40000172090A417270478172090AC1727047D1 -:10FF500080887047C0887047008970474089704723 -:10FF600001891B2924BF4189B1F5A47F07D381886A -:10FF70001B2921BFC088B0F5A47F01207047002055 -:10FF800070470A68426049688160704742680A6049 -:10FF9000806848607047017170470079704741710F -:10FFA000704740797047017911F0070F1BBF407906 -:10FFB00010F0070F002001207047017911F0070FA2 -:10FFC0001BBF407910F0070F00200120704701711E -:10FFD000704700797047417170474079704781716F -:10FFE000090AC1717047C088704716A282B0D2E971 -:10FFF0000012CDE900120179407901F0070269464B -:020000040002F8 -:100000001DF80220012A07D800F00700085C01282B -:100010009EBF012002B07047002002B070470171FE -:10002000704700797047417170474079704730B52B -:100030000C460546FB2988BFFFDF6C7030BD000011 -:1000400086F3FFFF000101020102020370B50446BE -:10005000C2F11005281901F04FFD15F0FF0108D07D -:10006000491EC9B2802060542046BDE8704001F0AE -:10007000BABD70BD30B505E05B1EDBB2CC5CD55CB3 -:100080006C40C454002BF7D130BD10B5002409E0FA -:100090000B78521E44EA430300F8013B11F8013B80 -:1000A000D2B2DC09002AF3D110BD2DE9F0410C4693 -:1000B00001200978FF4E92B0154602274FF006083E -:1000C0004FF0040C71B101291ED0022945D003293B -:1000D00005D12978042902D105201070002012B022 -:1000E000BDE8F081606850B1CDE9010601202070C3 -:1000F0008DF80080606A05901146684663E02770BD -:1001000085F800C0566026E029780429E7D169689F -:1001100010222069FFF7B9FF6868C07B000606D58A -:10012000E44A2069102310320146FFF7A3FFD4E907 -:1001300004101022FFF7A9FF2069C07B000606D536 -:10014000DC4A6069102310320146FFF793FF2770E5 -:1001500085F800C06E600320C1E729780429BED16C -:10016000A08910280CD9A0F1100080B2A081A1684C -:100170004FF01003014468466A68FFF77BFF18E000 -:1001800004D14FF010032269A16807E0C2B20EA8A3 -:10019000A168FFF75BFF626910230EA90AA8FFF7A9 -:1001A00069FF10230AA968466A68FFF763FF032006 -:1001B000207060680590CDF818D08DF81080606AC6 -:1001C0000990294604A8F1F759FF88E72DE9F04185 -:1001D00007460D4601200B7806213BB1012B04D1C7 -:1001E0001378052B01D11170002079E76C69012685 -:1001F00020226170E8686060686A6062A168287C9B -:100200000870A681A068A968401C01F075FCA0894F -:1002100020222030A081A0686968213001F06CFCA8 -:10022000A08921462030A0812E703846BDE8F041DB -:10023000F1F73BBF2DE9F05F0D46834601200978B9 -:10024000174606464FF00608D1B1DFF868A24FF016 -:100250000009AAF1080A012923D002297ED0032926 -:100260000CD13978052909D179681022E86901F0A3 -:1002700043FC07203870183500207D60BDE8F09FF2 -:100280002C6A8C48202284F8018020306060202075 -:10029000A081686A60626968A06801F02DFC2E7018 -:1002A000D4E039780529E9D12C6A84F80180686A9C -:1002B000606251681022E86901F01EFCE869606024 -:1002C000A0684F4680F80090A681A0684670A0897B -:1002D000401C80B2A081A1680844696951F8012FCF -:1002E000026089888180A089801D80B2A0816969AF -:1002F000A2680978C1F340011154A089401C80B262 -:10030000A081A1680844296951F8012F02608988F9 -:100310008180A089801D80B2A0812969A2680978A6 -:10032000C1F340011154A0891022401C80B2A08169 -:10033000A1680844E96801F0DFFBA08910221030B1 -:1003400080B2A081A1680844A96801F0D5FBA0890A -:10035000103080B2A081A168014400E00DE0DAF81D -:1003600004000860A089001D80B2A081A1680F541C -:10037000A089401CA081022067E03978052992D12C -:1003800051681022A86901F0B7FB2C6A84F801803B -:10039000E8696060686A6062A16881F80090A6817F -:1003A000A0684670A089401C80B2A081A168084462 -:1003B000696951F8012F026089888180A089801DB8 -:1003C00080B2A0816969A2680978C1F34001115423 -:1003D000A089401C80B2A081A1680844296951F815 -:1003E000012F026089888180A089801D80B2A08150 -:1003F0002969A2680978C1F340011154A08910222B -:10040000401C80B2A081A1680844E96801F074FB37 -:10041000A0891022103080B2A081A1680844A96888 -:1004200001F06AFBA089103080B2A081A16801446C -:10043000DAF804000860A089001D80B2A081A168DC -:100440000E54A089401CA0810320287021465846E4 -:10045000BDE8F05FF1F729BE70B50D460646097894 -:10046000012041B1012905D11178052902D10820C7 -:100470001070002070BD2C6A062060706968616091 -:10048000696A6162EA69A16852F8013F0B6092886B -:100490008A80A081E869A1680078C0F34000887173 -:1004A000A089401C80B2A081A1680844A96951F8C4 -:1004B000012F01E074230200026089888180A089F5 -:1004C000801D80B2A081A969A2680978C1F34001AA -:1004D0001154A089401C80B2A081A16808446969B8 -:1004E0000A88028089788170A0891022C01C80B29D -:1004F000A081A1680844296901F0FEFAA0891022B0 -:10050000103080B2A081A1680844E96801F0F4FAD3 -:10051000A0891022103080B2A081A1680844A96887 -:1005200001F0EAFAA08921461030A081012028704C -:100530003046BDE87040F1F7B8BD70B50D460646CF -:100540000978012059B1012908D11178052905D16F -:1005500009201070506800685060002070BD6C6900 -:10056000062010226070E8686060686A606229692D -:10057000A06801F0C1FA1020A081A06820221030EC -:10058000A96801F0B9FAA0892022203080B2A081A8 -:10059000A1680844696801F0AFFAA08921462030BB -:1005A000A081012028703046BDE87040F1F77DBD84 -:1005B00070B50C46012009788EB01546062659B153 -:1005C000012934D0022905D12978042902D10A2031 -:1005D000107000200EB070BD606910236A4600786C -:1005E000C0F340008DF80000A0690078C0F340001F -:1005F0008DF80100E0680168CDF802108188ADF83F -:10060000061080798DF8080020690168CDF809107E -:100610008188ADF80D1080798DF80F006068059025 -:100620000AA80690A168FFF725FD01201DE02978A2 -:100630000429CFD1A06910236A4650F8011F009108 -:100640008088ADF80400606950F8011FCDF80610ED -:100650008088ADF80A0000200390606805900AA821 -:1006600006906968FFF706FD022020708DF8106083 -:10067000606A0990294604A8F1F700FDAAE700B5D1 -:100680000B788BB001204BB1012B05D111780429D7 -:1006900002D10B20107000200BB000BD4868019003 -:1006A00006A80290C86803680693406807908868A7 -:1006B00003680893406809900120087006208DF8AF -:1006C0000000486A059011466846F1F7D7FCE3E759 -:1006D00000B50B788BB0012043B1012BDCD1117830 -:1006E0000429D9D10C2010700020D5E7486801906A -:1006F00006A8029088680368069340680790002067 -:10070000089009900120087006208DF80000486AC2 -:10071000059011466846F1F7B1FCBDE700B50B78CE -:100720008BB0012043B1012BB6D111780429B3D18C -:100730000D2010700020AFE748680590CDF818D064 -:1007400088680088ADF80000C8680088ADF802002D -:1007500000200190029003900120087006208DF87F -:100760001000486A0990114604A8F1F787FC93E746 -:1007700030B403460C7801205CB1012C15D0022C5A -:1007800005D111780C2902D10E201070002030BC48 -:10079000704701200870C868042242704A684260AD -:1007A0000B4A8260921EC2600BE014780D2CEED1D1 -:1007B00002200870C86803244470526842608A6846 -:1007C0008260496A4162014630BC1846F1F76DBC4F -:1007D0006E2302002DE9F0410C4611490D68104AC4 -:1007E000104908321160A0F120012A2901D301200B -:1007F0000CE03E2810D040CC0B4F94E80E0007EBE5 -:100800008000241F50F8807C3046B84720600448A0 -:10081000001D0560BDE8F0812046E0F7E1FCF5E74A -:100820001005024001000001A423020010B5524847 -:1008300000F070FA00B1FFDF4F48401C00F06AFA88 -:10084000002800D0FFDF10BD2DE9F14F4B4ED6F848 -:1008500000B00127484800F065FADFF81C8128B98C -:100860005FF0000708F1010000F072FA444C002527 -:100870004FF0030901206060C4F80051C4F804512E -:10088000009931602060DFF8FCA018E0DAF8000081 -:10089000C00614D50E2000F064F8EFF3108010F0BD -:1008A000010072B600D00120C4F80493D4F80011FE -:1008B00019B9D4F8041101B920BF00B962B6D4F84F -:1008C000000118B9D4F804010028DFD0D4F80401DD -:1008D0000028CFD137B1C6F800B008F1010000F010 -:1008E00021FA11E008F1010000F01CFA0028B9D14A -:1008F000C4F80893C4F80451C4F800510E2000F065 -:1009000030F81D4800F024FA0020BDE8F88F2DE9EA -:10091000F0438DB00D46064600240DF110090DF18F -:10092000200817E004EB4407102255F8271068460A -:1009300001F0E2F805EB870710224846796801F0DC -:10094000DBF86846FFF780FF10224146B86801F0E7 -:10095000D3F8641CB442E5DB0DB00020BDE8F083A1 -:1009600072E700F01F02012191404009800000F170 -:10097000E020C0F8801270478F01002004E500409D -:1009800000E0004010ED00E0D848002101708170C7 -:10099000704770B5D64D01232B60D64B1C68002CD8 -:1009A000FCD0002407E00E6806601E68002EFCD014 -:1009B000001D091D641C9442F5D3002028601868AE -:1009C0000028FCD070BD70B5C84E0446CA4D3078C2 -:1009D000022800D0FFDFAC4200D3FFDF7169C748B7 -:1009E000012903D847F23052944201DD03224271BB -:1009F000491C7161291BC160C0497078F2F782FA05 -:100A0000002800D1FFDF70BD70B5B84C0D4661788D -:100A1000884200D0FFDFB84E082D4ED2DFE805F047 -:100A20004D0421304D4D4D3B2078022800D0FFDF92 -:100A300003202070A078022802D0012804D008E00A -:100A4000A06800F051FD04E004F1080007C8FFF7BA -:100A5000A0FF052020700020A070BDE87040F1F7D5 -:100A600012BFF2F705F801466068F2F712FDB042D6 -:100A700002D2616902290BD30320F2F7E4FF12E0EE -:100A8000F1F7F6FF01466068F2F703FDB042F3D2DA -:100A9000BDE8704097E7207802280AD0052806D0E4 -:100AA000FFDF04202070BDE8704000F014B9022080 -:100AB00000E00320F2F7C7FFF3E7FFDF70BD70B57A -:100AC0000546F1F7D5FF894C60602078012800D0F9 -:100AD000FFDF8A4901200870002008718D60042022 -:100AE00048718548C860022020706078F2F70AFAE1 -:100AF000002800D1FFDF70BD10B57C4CA07808B98C -:100B0000207808B1112010BD7D48F1F737FF6070E3 -:100B10006078202804D0012020700020606110BD82 -:100B2000032010BD0246010B0120B2F5003F02D2A6 -:100B3000884000F071BFB2F5802F03D22039884081 -:100B400000F072BFB2F5C02F03D24039884000F0E8 -:100B500074BFB2F5002F03D26039884000F076BF31 -:100B6000002070472DE9F041144600EB84070E4643 -:100B700005463F1F00F0CBFC4FF080510A695043FF -:100B800006EB8402121FB24201D2012200E00022D1 -:100B90001CB10969B4EB910F02D90920BDE8F081BD -:100BA00058498D4216D3AF4214D3854205D28742AD -:100BB00003D245EA0600800701D01020EEE78E42FE -:100BC00008D33AB92846FFF7ADFF18B93846FFF702 -:100BD000A9FF08B10F20E1E74B484C490068884263 -:100BE00005D0224631462846FFF7D3FE10E0FFF736 -:100BF00083FF0028D2D13D4801218560C0E903640C -:100C000081704FF4A97104FB01F01830FFF757FF12 -:100C10000020C3E770B54FF0805504462869394974 -:100C2000B1FBF0F084420AD300F071FCA04201D87D -:100C3000102070BD28696043FFF774FF08B10F20D2 -:100C400070BD314831490068884204D0286960434A -:100C500000F04AFC0CE0FFF74FFF0028F0D12969B3 -:100C6000224861438160022181702948FFF727FFF4 -:100C7000002070BD2349090BB1EB401F07D940424A -:100C800001EB4011202903D34FF0FF3070470021C2 -:100C900001208840401E704770B505460C46002074 -:100CA000FFF7E8FF28420ED10120FFF7E3FF2042C3 -:100CB00009D10220FFF7DEFF104204D10320FFF725 -:100CC000D9FF184201D00F2070BD21462846BDE84B -:100CD000704000F0C4BE10B5044C6078F1F7A9FE76 -:100CE00000B9FFDF00202070A07010BD940100202B -:100CF00004E5014000E40140105C0C00C412002037 -:100D0000090A020000300200B0000020BEBAFECA8C -:100D10007C5E0100002101700846704701460020FA -:100D200008707047EFF3108101F0010172B602788C -:100D3000012A01D0012200E000220123037001B941 -:100D400062B60AB1002070474FF400507047E9E7DF -:100D5000EFF3108111F0010F72B64FF00002027034 -:100D600000D162B600207047F2E700004C490968E4 -:100D70000160002070474A49086000207047012147 -:100D80008A0720B1012804D042F20400704791671D -:100D900000E0D1670020704742490120086042F21C -:100DA0000600704708B504233E4A1907103230B1D7 -:100DB000C1F80433106840F0010010600BE01068C7 -:100DC00020F001001060C1F808330020C1F80801CC -:100DD000354800680090002008BD011F0B2909D884 -:100DE000304910310A6822F01E0242EA40000860D1 -:100DF0000020704742F205007047000100F180407A -:100E0000C0F8041900207047000100F18040C0F8CC -:100E1000081900207047000100F18040D0F8000957 -:100E2000086000207047012801D9072070471F4A39 -:100E300052F8200002680A4302600020704701282F -:100E400001D907207047194A52F8200002688A43E6 -:100E5000026000207047012801D907207047134A1B -:100E600052F8200000680860002070470200104916 -:100E70004FF0000003D0012A01D0072070470A601C -:100E800070474FF080410020C1F808014FF0E0208A -:100E9000802180F800140121C0F800117047000083 -:100EA0000004004000050040080100404C240200FE -:100EB000780500406249634B0A6863499A420968B1 -:100EC00001D1C1F310010160002070475C495D4B06 -:100ED0000A685D49091D9A4201D1C0F310000860FB -:100EE000002070475649574B0A68574908319A42C3 -:100EF00001D1C0F3100008600020704730B5504B9E -:100F0000504D1C6842F20803AC4202D0142802D2B1 -:100F100003E0112801D3184630BDC3004B481844E4 -:100F2000C0F81015C0F81425002030BD4449454BC9 -:100F30000A6842F209019A4202D0062802D203E06E -:100F4000042801D308467047404A012142F8301076 -:100F5000002070473A493B4B0A6842F209019A4225 -:100F600002D0062802D203E0042801D308467047C5 -:100F7000364A012102EBC00041600020704770B585 -:100F80002F4A304E314C156842F2090304EB8002BF -:100F9000B54204D0062804D2C2F8001807E004289D -:100FA00001D3184670BDC1F31000C2F8000800203C -:100FB00070BD70B5224A234E244C156842F20903D5 -:100FC00004EB8002B54204D0062804D2D2F800080F -:100FD00007E0042801D3184670BDD2F80008C0F31A -:100FE00010000860002070BD174910B5083118487E -:100FF00008601120154A002102EBC003C3F8101548 -:10100000C3F81415401C1428F6D3002006E0042869 -:1010100004D302EB8003C3F8001807E002EB80035F -:10102000D3F80048C4F31004C3F80048401C062855 -:10103000EDD310BD04490648083108607047000030 -:10104000B0000020BEBAFECA00F5014000F0014029 -:101050000000FEFF7D4B1B6803B19847BFF34F8F25 -:101060007B4801687B4A01F4E06111430160BFF3F2 -:101070004F8FFEE710B5EFF3108010F0010F72B63E -:1010800001D0012400E0002400F0D6F850B1E0F7D0 -:1010900041F9F1F7BCFAF2F777FCE1F7C0FE6E49CF -:1010A0000020086004B962B6002010BD70B50C467F -:1010B0000646EFF3108010F0010F72B601D0012543 -:1010C00000E0002500F0B8F818B105B962B60820B4 -:1010D00070BDE0F79BF8E0F71FF9024600204309D6 -:1010E0009B0003F1E02300F01F01D3F80031CB4057 -:1010F000D9071BD0202803D222FA00F1C90722D138 -:1011000041B2002906DA01F00F0101F1E02191F866 -:10111000141D03E001F1E02191F8001449090829A8 -:1011200011D281B101290ED004290CD0401C6428B1 -:10113000D5D3E1F74BFE4849484808602046F3F70D -:101140008FF860B904E005B962B641F2010070BDE4 -:101150003E4804602EB13046F3F7CFF818B11024A2 -:1011600029E03F4E16E03078022802D94FF480542F -:1011700021E007240028707801D0E0B908E0D0B160 -:10118000202818D8B078212815D8012813D001E0DC -:10119000B07880B93349802081F8140DE0F7BCF8AD -:1011A0003146F2F7D7FBF1F7F1F900F0E3F93046F9 -:1011B000E0F782F8044605B962B61CB1FFF75AFFA2 -:1011C000204670BD002070BD10B5044600F034F814 -:1011D00000B101202070002010BD234908600020CC -:1011E000704770B50C4621490D682049204E0831E2 -:1011F0000E60102807D011280CD012280FD0132809 -:1012000011D0012013E0D4E90001FFF74FFF35466C -:1012100020600DE0FFF72EFF0025206008E0206829 -:10122000FFF7D2FF03E0104920680860002020602B -:101230000E48001D056070BD0748084900688842D7 -:1012400001D101207047002070470000AC01002050 -:101250000CED00E00400FA05B0000020BEBAFECAA2 -:10126000542402000BE000E00400002010050240BE -:101270000100000100B5764910F1080F08BFF82001 -:1012800024D014DC10F1280F08BFD8201ED010F194 -:10129000140F08BFEC2019D010F1100F08BFF02078 -:1012A00014D010F10C0F08BFF4200FD00CE010F197 -:1012B000040F08BFFC2009D0002818BF032805D060 -:1012C000042804BF086000BDFFDF00BD086000BD4A -:1012D00000B56049012808BF032004D0022816BFCA -:1012E000FFDF042000BD086000BD5A48016801F01E -:1012F0000F01032904BF01207047006800F00F00B0 -:10130000042804BF0220704700B5FFDF012000BDA4 -:101310005149002808BF086805D0012806BF0868A1 -:1013200040F0010070470860704770B5054601291C -:1013300014D0022A07BF49484FF47A7148484FF445 -:10134000C86144181846F4F759F820444FF47A71EC -:1013500000F27120B0FBF1F0281A70BD022A14BF10 -:101360004FF4C8604FF47A7049F608514418E9E721 -:1013700070B514460546012908BF49F6CA6605D06E -:10138000022B0CBF3748364800F1FA061046F4F736 -:1013900044F8012C0CBF4FF47A714FF4FA71711AB2 -:1013A00008444FF47A7100F28920B0FBF1F0281A5A -:1013B000801E70BD70B51546064601291AD0022B55 -:1013C00007BF26484FF47A7125484FF4C861441886 -:1013D0001046F4F722F8012D0CBF4FF47A714FF448 -:1013E000FA71611A08444FF47A716438B0FBF1F075 -:1013F000301A70BD022B14BF4FF4C8604FF47A70DE -:1014000049F608514418E3E770B505460C46164600 -:101410001046F3F7F3FF05EB4501C1EBC51100EBF7 -:10142000C100012C0CBF4FF47A714FF4FA714518CA -:101430002046F3F7F2FF281A4FF47A7100F60F6096 -:10144000B0FBF1F43046F3F7CDFF2044401D70BDF2 -:101450000C15004010150040501600406836020080 -:10146000A2240200043602002DE9F04184B088462F -:101470000746FEF70FFC05467E786A4601A94046FE -:10148000EFF748F804000ED0012D1EBF032004B072 -:10149000BDE8F08102AA40460199EEF73AFF0298B2 -:1014A000B0F803000AE0022D18D1042E16D3B7F8C5 -:1014B0000300BDF80020011D8A4206D3001D80B242 -:1014C000A119814238BF012004D104B04FF00000BF -:1014D000BDE8F0813CBF04B0BDE8F0814FF00200F0 -:1014E00004B0BDE8F08100000B4A022111600B49F5 -:1014F0000B68002BFCD0084B1B1D186008680028E7 -:10150000FCD00020106008680028FCD070474FF025 -:10151000805040697047000004E5014000E401404C -:1015200002000B464FF00000014620D0012A04D0F3 -:10153000022A04D0032A0DD103E0012002E0022098 -:1015400015E00320072B05D2DFE803F00406080AA4 -:101550000C0E100007207047012108E0022106E070 -:10156000032104E0042102E0052100E00621F1F757 -:1015700022BA0000FC4805218170002101704170F1 -:10158000C17081607047F9490A78012A06D0CA689B -:101590001044C860C8684038F1F748BF8A681044F2 -:1015A00088608868F7E710B5EF4CE078F1F741FA0A -:1015B00000B9FFDF0820F2F746FA0520A0700020EE -:1015C0002070607010BD002819D00378E849E94AFE -:1015D00013B1012B0ED011E00379012B00D06BB9B0 -:1015E00043790BB1012B09D18368643B8B4205D24F -:1015F000C0680EE00379012B02D00BB100207047C8 -:1016000043790BB1012BF9D1C368643B8B42F5D20E -:1016100080689042F2D8012070472DE9F0410446DD -:101620000227F1F72FFE006800B1FFDFCE4D012643 -:101630003CB12078B0B1012805D0022810D0032891 -:1016400013D02E710CE06068C82807D3F1F755FF5E -:1016500020B16068FFF797FF012703E0002701E052 -:1016600000F0CCF93846BDE8F08128780028F7D1A1 -:101670006068FFF7A8FF0028E3D06068DFF8EC821D -:10168000007828B3A878042800D0FFDF0020464661 -:1016900088F8000060680079C8B300203071606885 -:1016A0004079A8B30420707160688168E868F0F739 -:1016B000EAFEB0606068C0685230F0600320A87035 -:1016C000AA49E878F1F71EFC0028C9D1FFDFC7E777 -:1016D000404688F8006061680979D1B10021017144 -:1016E00061684979B9B104214171616889685231F1 -:1016F00081606168C968C160C0689B4C14346060D7 -:10170000F1F7B6F920606E700220A870A8E704E037 -:1017100005E00321E3E70321E6E70120BEE703201C -:10172000C1E72DE9F047904C8846E178884200D027 -:10173000FFDFDFF83492002501278C4E09F11409F0 -:10174000B8F1080F79D2DFE808F0040D2A557E843D -:101750009199A078032803D0A078022800D0FFDF59 -:10176000BDE8F087A078032803D0A078022800D035 -:10177000FFDF0420A0702571207800287AD1FFF7C0 -:1017800002FF3078012806D0B068E06000F07BF9F5 -:101790002061002062E0E078F1F7B0FAF5E7A07888 -:1017A000032803D0A078022800D0FFDF207800288B -:1017B0006FD1A078032816D0F1F75AF901464F46A9 -:1017C000D9F80000F1F765FE00280EDB7968814248 -:1017D0000BDB081AF0606549E078F1F793FB00280D -:1017E000BED1FFDFBCE7042029E00420F2F72BF98B -:1017F000A570B5E7A078032803D0A078022800D010 -:10180000FFDF207888BBA078032817D0F1F730F9E4 -:1018100001464F46D9F80000F1F73BFE0028E4DB13 -:1018200079688142E1DB081AF0605049E078F1F70D -:1018300069FB002894D1FFDF92E740E00520F2F732 -:1018400002F9A7708CE7A078042800D0FFDF0220FF -:1018500004E0A078042800D0FFDF0120A1688847B9 -:10186000FFF7DBFE054630E004E012E0A078042834 -:1018700000D0FFDFBDE8F04700F0C0B8A078042832 -:1018800005D0607810B1A078022800D0FFDF207862 -:1018900010B1BDE8F04786E6207920B10620F2F7C6 -:1018A000D2F82571CDE7607838B13049E078F1F7AA -:1018B00029FB00B9FFDF657052E70720BFE7FFDFB4 -:1018C0004EE73DB1012D03D0FFDF022DF9D147E7EF -:1018D0000420C3E70320C1E770B5050005D0224C02 -:1018E000A078052803D0112070BD102070BD2248BB -:1018F000F1F744F8E070E078202803D0A5600020DC -:10190000A07070BD032070BD174810B5017809B1F3 -:10191000112010BD817805290CD0817801290BD0C8 -:10192000817849B1012101708178012904D0807842 -:1019300010B103E00F2010BDFFF735FE002010BDF1 -:1019400070B5094E0446B07808B101280AD1ACB18F -:101950002046FFF738FE98B12078044D90B1B0785A -:1019600001282AD00F2070BDB0010020D412002021 -:101970003D860100FF1FA107231702001020F2E798 -:101980000720F0E701202870207990B1002028710D -:10199000607980B104206871A0685230A860E06866 -:1019A000E860E8681A4C6060F1F762F82060022095 -:1019B00016E00320EBE70320EDE7002028702079F4 -:1019C000A8B100202871607998B104206871A168DD -:1019D000F068F0F758FDA860E0685230E860032036 -:1019E000B0700C49F078F1F78DFA28B903E00320C4 -:1019F000E8E70320EAE7FFDF0020B4E7044810B57A -:101A00001438006900F037F8BDE81040F0F73BBF2C -:101A1000C4010020D41200201F490968014201D0EE -:101A200001207047002070471B49091D09680142C9 -:101A300001D0012070470020704717491031096814 -:101A4000014201D001207047002070471249143133 -:101A50000968014201D0012070470020704710B58D -:101A60000D4C2060201D01600B4810300260001DED -:101A70000360002010BD09490A6848F202139A4326 -:101A800002430A607047054A116848F2021301EAEE -:101A9000030099431160704700060040C8060240E9 -:101AA00040EA010310B59B070FD1042A0DD310C8DB -:101AB00008C9121F9C42F8D020BA19BA884201D92D -:101AC000012010BD4FF0FF3010BD1AB1D30703D075 -:101AD000521C07E0002010BD10F8013B11F8014B2B -:101AE0001B1B07D110F8013B11F8014B1B1B01D147 -:101AF000921EF1D1184610BD032A40F2308010F03A -:101B0000030C00F0158011F8013BBCF1020F624498 -:101B100098BF11F801CB00F8013B38BF11F8013B29 -:101B2000A2F1040298BF00F801CB38BF00F8013BD6 -:101B300011F0030300F02580083AC0F0088051F846 -:101B4000043B083A51F804CBA0E80810F5E7121D51 -:101B50005CBF51F8043B40F8043BAFF30080D20770 -:101B600024BF11F8013B11F801CB48BF11F8012B3C -:101B700024BF00F8013B00F801CB48BF00F8012B5F -:101B8000704710B5203AC0F00B80B1E81850203AE9 -:101B9000A0E81850B1E81850A0E81850BFF4F5AF0D -:101BA0005FEA027C24BFB1E81850A0E8185044BF97 -:101BB00018C918C0BDE810405FEA827C24BF51F804 -:101BC000043B40F8043B08BF7047D20728BF31F8F8 -:101BD000023B48BF11F8012B28BF20F8023B48BF49 -:101BE00000F8012B70474FF000020429C0F012806A -:101BF00010F0030C00F01B80CCF1040CBCF1020FC0 -:101C000018BF00F8012BA8BF20F8022BA1EB0C0194 -:101C100000F00DB85FEAC17C24BF00F8012B00F88A -:101C2000012B48BF00F8012B70474FF0000200B5B0 -:101C3000134694469646203922BFA0E80C50A0E8EF -:101C40000C50B1F12001BFF4F7AF090728BFA0E89D -:101C50000C5048BF0CC05DF804EB890028BF40F869 -:101C6000042B08BF704748BF20F8022B11F0804FAB -:101C700018BF00F8012B704770477047704700008D -:101C8000FEDF04207146084219D10699124A91429A -:101C900015DC069902394878DF2810D10878FE282B -:101CA00007D0FF280BD14FF001004FF000020B4B83 -:101CB000184741F201000099019A084B1847084B58 -:101CC000002B02D01B68DB6818474FF0FF307146CD -:101CD0004FF00002014B184700300200551002007F -:101CE00004000020184819497047FFF7FBFFDFF791 -:101CF00065FA00BD4FF4805015490968884203D148 -:101D0000144A13605B68184700BD000020BFFDE760 -:101D10004FF480500E490968884210D10E4B186864 -:101D20004FF0FF318842F1D080F308884FF0202136 -:101D3000884204DD0948026802210A43026008481B -:101D4000804708488047FFDFE8120020E8120020A3 -:101D500000000020040000200030020024050040A4 -:101D600039430100F51C020004207146084202D0EC -:101D7000EFF3098101E0EFF3088188690238007808 -:101D8000102813DB20280FDB2B280BDB0A4A1268F4 -:101D90000A4B9A4203D1602804DB094A104702200B -:101DA00008607047074A1047074A1047074A1268F9 -:101DB0002C32126810470000B0000020BEBAFECAE4 -:101DC0001D130000D5070200E311020004000020EB -:101DD0000D4B0E4908470E4B0C4908470D4B0B495C -:101DE00008470D4B094908470C4B084908470C4B5D -:101DF000064908470B4B054908470B4B0349084761 -:101E00000A4B024908470000F9BA0000092F0000F8 -:101E1000812C00001D2B0000AB2A0000232D0000A8 -:101E2000391300006728000029BD0000C911000017 -:101E300000210160818070470021016041600172D2 -:101E400070470A6802600B7903717047599500006A -:101E50001B970000779800009B980000D598000021 -:101E6000099900004399000081990000D39900006E -:101E700031960000A7120000A7120000C140000028 -:101E80000541000025410000E1410000274300001A -:101E90000144000031440000F5440000153D0000FD -:101EA000274700001948000039480000DD150000F0 -:101EB00001160000311500008515000033160000E2 -:101EC000C716000003600000B561000073650000E4 -:101ED000896600000D67000087670000F967000051 -:101EE00015690000E3690000616A000053480000C2 -:101EF0005948000063480000D73C00001F4900001B -:101F0000A13C00005F4A0000B74A00001F4B0000E0 -:101F1000A7120000A7120000A7120000A7240000CB -:101F20002D2500004925000065250000F32600004E -:101F30008F25000099250000DB250000FD2500000D -:101F4000D92600001B270000A7120000CF82000046 -:101F5000F7820000F98200003383000061830000F3 -:101F60004F840000DB840000EF8400003D8500000A -:101F70002D860000D1870000F9880000D172000092 -:101F800011890000A7120000A712000049B4000048 -:101F9000B3B5000007B6000073B6000023B7000019 -:101FA00051000000000000000000000000000000E0 -:101FB0000000000000000000000000000000000021 -:101FC0000000000000000000000000003E000000D3 -:101FD0000000000000000000000000000000000001 -:101FE00000000000000000000000000000000000F1 -:101FF0000000000000000000500000000000000091 -:1020000000000000000000000000000000000000D0 -:1020100000000000000000000000000000000000C0 -:1020200000000000100110013A0200001A02000432 -:102030000506000013900000F38F0000FFFFFFFF74 -:102040000000FFFF3BAC00003D39000041200000D4 -:102050001B730000EB8D0000000000000000020078 -:10206000000000000002000000000000000100006D -:10207000000000006F8000004F800000BD80000065 -:1020800029240000EB2300000B240000A7A7000078 -:10209000D3A70000DBA9000021590000DD8000006B -:1020A000000000000D810000772400000000000007 -:1020B0000000000000000000BDA8000000000000BB -:1020C000B359000000000000000000000000000004 -:1020D0000000000000000000000000000000000000 -:1020E000000000000000000000000000D5E5000036 -:1020F00059E60000000000000000000000000000A1 -:1021000059E700000000000000000000000000008F -:1021100049F800000000000000000000000000007E -:1021200005E900005DF4000000000000DDF400009F -:1021300051F500000000000037EE0000D5EE000071 -:102140000000000017F50000D1EF0000C9F1000009 -:102150003DF2000041F30000A5EA0000000000008D -:1021600000000000BFE90000000000001FE80000C0 -:1021700095E70000BDF300007BF60000E9F60000E3 -:1021800000000000A7E60000D7E6000007E6000018 -:102190000000000021E70000000000000000000037 -:1021A000000000004BF700000000000000000000ED -:1021B000000000000000000000000000EFEC000044 -:1021C000000000000000000000000000C3E8000064 -:1021D000C1E700008BE800000000000053E80000A9 -:1021E0000000000000000000B3F7000097F80000B6 -:1021F0009BFA000017F900003DE9000051FA0000C9 -:10220000000000004FEB000021EC000061F900002D -:10221000ABF9000007F80000E5F90000F1ED00005F -:1022200093560000935600009D400000E7AA00006E -:102230009F750000531F000087AA01004BC50100D5 -:10224000D9560000D9560000BF40000049AB00003D -:1022500023760000C51F0000B5AA01005FC501007C -:10226000D001D001400038005C0024004001F001A2 -:1022700001000000010000000001020304120F1021 -:102280001100000013000000B10502007F060200EB -:10229000D10602001D07020071070200AB00020018 -:1022A000CD01020035020200590402003B05020084 -:1022B000750D01008B1E01000000000006000000EB -:1022C0000A0000003200000073000000B4000000AB -:1022D000B197010045850100235F010077DE010011 -:1022E000F772010077DE01007D5F010005E001006B -:1022F000876B010005E001007B5E010093DF0100B8 -:10230000C971010093DF01004D630100FFE201008C -:102310007F730100FFE20100555555D6BE898E003E -:102320000000A606340DC21300004A03EE05920811 -:10233000000096041409920D555555252627D6BE42 -:10234000898EF401FA00960064004B0032001E00F2 -:1023500014000A00050002000100000025410000F1 -:1023600000000000AAAED7AB15412010000003000A -:10237000656C7462000000000000000000000000B6 -:1023800000000000870000000000000000000000C6 -:1023900000000000BE83605ADB0B376038A5F5AA49 -:1023A0009183886CB50E0200CD0E0200E50E02008E -:1023B000FD0E02002D0F0200550F02007F0F0200DC -:1023C000B30F0200150C0200650B0200990C02000D -:1023D000150D0200250D0200510D0200A33B010066 -:1023E000AB3B0100B93B01007F0D0200990D0200DB -:1023F0006D0D0200770D0200A50D0200DB0D02003D -:10240000FB0D0200090E0200170E0200270E02004B -:102410003F0E0200570E02006D0E02000000000089 -:10242000F7B800004DB9000063B9000021150200A3 -:10243000490802000F090200D91802000919020018 -:1024400041190200E93901000D3E01001C05004060 -:10245000200500400010020078240200080000203F -:10246000C401000044110000A8240200CC01002097 -:102470001C110000A01100000118136813024C2069 -:102480001A010222782720FB349B5F801280021EF3 -:1024900010139F0A1B205C041AE2040128237F0109 -:0824A00002A329091DFB013113 -:00000001FF diff --git a/ports/nrf/boards/feather_nrf52832/README.md b/ports/nrf/boards/feather_nrf52832/README.md deleted file mode 100644 index ef910509a3..0000000000 --- a/ports/nrf/boards/feather_nrf52832/README.md +++ /dev/null @@ -1,192 +0,0 @@ -# Setup - -## Installing CircuitPython submodules - -Before you can build, you will need to run the following commands once, which -will install the submodules that are part of the CircuitPython ecosystem, and -build the `mpy-cross` tool: - -``` -$ cd circuitpython -$ git submodule update --init -$ make -C mpy-cross -``` - -You then need to download the SD and Nordic SDK files via: - -> This script relies on `wget`, which must be available from the command line. - -``` -$ cd ports/nrf -$ ./bluetooth/download_ble_stack.sh -``` - -## Installing `adafruit-nrfutil` - -The Adafruit Bluefruit nRF52 Feather ships with a serial and OTA BLE bootloader -that can be used to flash firmware images over a simple serial connection, -using the on-board USB serial converter. - -run following command to install [adafruit-nrfutil](https://github.com/adafruit/Adafruit_nRF52_nrfutil) from PyPi - - $ pip3 install --user adafruit-nrfutil - -# Building and flashing firmware images - -## Building CircuitPython binaries - -#### REPL over UART (default settings) - -To build a CircuitPython binary with default settings for the -`feather_nrf52832` target enter: - -> **NOTE:** `BOARD=feather_nrf52832` is the default option and isn't stricly required. - -``` -$ make BOARD=feather_nrf52832 V=1 -``` - -#### REPL over BLE UART (AKA 'NUS') - -To build a CircuitPython binary that uses the Nordic UART Service (AKA 'NUS' or -'BLEUART'), modify `/ports/nrf/bluetooth_conf.h` to have the following macro -set to `1` in the `#elif (BLUETOOTH_SD == 132)` section: - -``` -#define MICROPY_PY_BLE_NUS (1) -``` - -... then build as normal, via: - -``` -$ make BOARD=feather52832 V=1 -``` - -You can then connect over BLE UART using an application like Bluefruit LE -Connect, available for Android, iOS and OS X, or any other application that -supports the NUS service and allows you to send the corrent EOL sequence. - -## Flashing binaries with `adafruit-nrfutil` - -### 1. **Update bootloader** to single-bank version - -The Adafruit nRF52 Feather ships, by default, with a **dual-bank** bootloader -that cuts the available flash memory in half in exchange for safer -OTA updates. - -Due to the size of CircuitPython, we must migrate this bootloader to a -**single-bank** version, doubling the amount of flash memory available to us. - -> These commands only need to be run once and will update the SoftDevice and -bootloader from the dual-bank version that ships on Arduino-based Adafruit -Feather52 boards to a single-bank CircuitPython compatible version: - -Firstly clone the [Adafruit_nRF52_Bootloader](https://github.com/adafruit/Adafruit_nRF52_Bootloader.git) and enter its directory - - $ git clone https://github.com/adafruit/Adafruit_nRF52_Bootloader.git - $ cd Adafruit_nRF52_Bootloader - -#### S132 v2.0.1 single-bank (recommended): - -To flash bootloader with s132 v2.0.1 - -``` -$ make BOARD=feather_nrf52832 VERSION=2.0.1 SERIAL=/dev/tty.SLAB_USBtoUART dfu-flash -``` - -#### S132 v5.0.0 (BLE5, experimental): - -To flash bootloader with s132 v5.0.0 - -``` -$ make BOARD=feather52832 VERSION=5.0.0 SERIAL=/dev/tty.SLAB_USBtoUART dfu-flash -``` - -### 2. Generate and flash a CircuitPython DFU .zip package over serial - -The following command will package and flash the CircuitPython binary using the -appropriate bootloader mentionned above. - -This command assumes you have already built a valid circuitpython -image, as described earlier in this readme. - -> The name of the serial port target will vary, depending on your OS. - -``` -$ make BOARD=feather_nrf52832 SERIAL=/dev/tty.SLAB_USBtoUART dfu-gen dfu-flash -``` - -By default, CircuitPython will build with **BLE** support enabled using -`SD=s132` and the `SOFTDEV_VERSION=2.0.1`. If you wish to specify a different -SD family or version you can enter the optional fields as shown below: - -``` -$ make BOARD=feather_nrf52832 SERIAL=/dev/tty.SLAB_USBtoUART SD=s132 SOFTDEV_VERSION=5.0.0 dfu-gen dfu-flash -``` - -## Working with CircuitPython - -### Running local files with `ampy` - -[ampy](https://learn.adafruit.com/micropython-basics-load-files-and-run-code/install-ampy) -is a command-line tool that can be used with the nRF52 Feather to transfer -local python files to the nRF52 for execution, rather than having to enter -the REPL manually, enter paste mode, and paste the code yourself. - -> **IMPORTANT**: You must have `ampy` version **1.0.3** or higher to use `ampy` - with the nRF52. The bootloader on the nRF52 requires a delay between the - HW reset, and the moment when the command sequance is sent to enter raw - mode. This required `-d/--delay` flag was added in release 1.0.3. - - -Save the following file as `test.py`: - -``` -import board -import digitalio -import time - -led = digitalio.DigitalInOut(board.LED2) -led.direction = digitalio.Direction.OUTPUT - -while True: - led.value = True - time.sleep(0.5) - led.value = False - time.sleep(0.5) -``` - -Then run the saved file via ampy, updating the serial port as required: - -``` -$ ampy -p /dev/tty.SLAB_USBtoUART -d 1.5 run test.py -``` - -This should give you blinky at 1 Hz on LED2 (the blue LED on the nRF52 Feather). - -### Uploading files and libraries with `ampy` - -To upload Python files or pre-compiled CircuitPython libraries to the `lib` folder, -run the following commands: - -> In this example **i2c_device.py** is used, which is part of - [Adafruit_CircuitPython_BusDevice](https://github.com/adafruit/Adafruit_CircuitPython_BusDevice) - -``` -$ ampy -p /dev/tty.SLAB_USBtoUART -d 1.5 put i2c_device.py lib/i2c_device.py -``` - -To verify that the file was uploaded correctly, you can check the contents of -the `lib` folder with: - -``` -$ ampy -p /dev/tty.SLAB_USBtoUART -d 1.5 ls /lib -i2c_device.py -``` - -### Suggested libraries - -The following libraries should be installed as a minimum on most new boards: - -- [Adafruit_CircuitPython_BusDevice](https://github.com/adafruit/Adafruit_CircuitPython_BusDevice) -- [Adafruit_CircuitPython_Register](https://github.com/adafruit/Adafruit_CircuitPython_Register/tree/master) diff --git a/ports/nrf/boards/feather_nrf52832/custom_nrf52832_dfu_app_2.0.1.ld b/ports/nrf/boards/feather_nrf52832/custom_nrf52832_dfu_app_2.0.1.ld deleted file mode 100644 index a1c128e377..0000000000 --- a/ports/nrf/boards/feather_nrf52832/custom_nrf52832_dfu_app_2.0.1.ld +++ /dev/null @@ -1,44 +0,0 @@ -/* - GNU linker script for NRF52 w/ s132 2.0.1 SoftDevice - - MEMORY MAP - ------------------------------------------------------------------------ - START ADDR END ADDR SIZE DESCRIPTION - ---------- ---------- ------- ----------------------------------------- - 0x0007F000..0x0007FFFF ( 4KB) Bootloader Settings - 0x0007E000..0x0007EFFF ( 4KB) Master Boot Record Params - 0x00074000..0x0007DFFF ( 40KB) Serial + OTA Bootloader - - 0x00073000..0x00073FFF ( 4KB ) Private Config Data (Bonding, Keys, etc.) - 0x00072000..0x00072FFF ( 4KB ) User NVM data - 0x00059000..0x00071FFF (100KB) User Filesystem - - 0x0001C000..0x00058FFF (244KB) Application Code - 0x00001000..0x0001BFFF (108KB) SoftDevice - 0x00000000..0x00000FFF (4KB) Master Boot Record -*/ - -/* Specify the memory areas (S132 2.0.1) */ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x080000 /* entire flash, 512 KiB */ - FLASH_ISR (rx) : ORIGIN = 0x0001c000, LENGTH = 0x001000 /* sector 0, 4 KiB */ - FLASH_TEXT (rx) : ORIGIN = 0x0001d000, LENGTH = 0x03C000 /* APP - ISR, 240 KiB */ - FLASH_FATFS (r) : ORIGIN = 0x00059000, LENGTH = 0x019000 /* File system 100KB KB */ - RAM (xrw) : ORIGIN = 0x20003000, LENGTH = 0x0D000 /* 52 KiB, give 8KiB headroom for softdevice */ -} - -/* produce a link error if there is not this amount of RAM for these sections */ -_minimum_stack_size = 2K; -_minimum_heap_size = 0 /*16K Circuit Python use static variable for HEAP */; - -/* top end of the stack */ - -/*_stack_end = ORIGIN(RAM) + LENGTH(RAM);*/ -_estack = ORIGIN(RAM) + LENGTH(RAM); - -/* RAM extents for the garbage collector */ -_ram_end = ORIGIN(RAM) + LENGTH(RAM); -_heap_end = 0x20007000; /* tunable */ - -INCLUDE "boards/common.ld" diff --git a/ports/nrf/boards/feather_nrf52832/custom_nrf52832_dfu_app_5.0.0.ld b/ports/nrf/boards/feather_nrf52832/custom_nrf52832_dfu_app_5.0.0.ld deleted file mode 100644 index f9209bf3d1..0000000000 --- a/ports/nrf/boards/feather_nrf52832/custom_nrf52832_dfu_app_5.0.0.ld +++ /dev/null @@ -1,44 +0,0 @@ -/* - GNU linker script for NRF52 w/ s132 5.0.0 SoftDevice - - MEMORY MAP - ------------------------------------------------------------------------ - START ADDR END ADDR SIZE DESCRIPTION - ---------- ---------- ------- ----------------------------------------- - 0x0007F000..0x0007FFFF ( 4KB) Bootloader Settings - 0x0007E000..0x0007EFFF ( 4KB) Master Boot Record Params - 0x00074000..0x0007DFFF ( 40KB) Serial + OTA Bootloader - - 0x00073000..0x00073FFF ( 4KB ) Private Config Data (Bonding, Keys, etc.) - 0x00072000..0x00072FFF ( 4KB ) User NVM data - 0x00059000..0x00071FFF ( 100KB) User Filesystem - - 0x00023000..0x00058FFF (216KB) Application Code - 0x00001000..0x00022FFF (136KB) SoftDevice - 0x00000000..0x00000FFF (4KB) Master Boot Record -*/ - -/* Specify the memory areas (S132 5.0.0) */ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x080000 /* entire flash, 512 KiB */ - FLASH_ISR (rx) : ORIGIN = 0x00023000, LENGTH = 0x001000 /* sector 0, 4 KiB */ - FLASH_TEXT (rx) : ORIGIN = 0x00024000, LENGTH = 0x036000 /* APP - ISR, 216 KiB */ - FLASH_FATFS (r) : ORIGIN = 0x00059000, LENGTH = 0x019000 /* File system 100KB KB */ - RAM (xrw) : ORIGIN = 0x200039c0, LENGTH = 0x0c640 /* 49.5 KiB, give 8KiB headroom for softdevice */ -} - -/* produce a link error if there is not this amount of RAM for these sections */ -_minimum_stack_size = 2K; -_minimum_heap_size = 0 /*16K Circuit Python use static variable for HEAP */; - -/* top end of the stack */ - -/*_stack_end = ORIGIN(RAM) + LENGTH(RAM);*/ -_estack = ORIGIN(RAM) + LENGTH(RAM); - -/* RAM extents for the garbage collector */ -_ram_end = ORIGIN(RAM) + LENGTH(RAM); -_heap_end = 0x20007000; /* tunable */ - -INCLUDE "boards/common.ld" diff --git a/ports/nrf/boards/feather_nrf52832/examples/ble_scan.py b/ports/nrf/boards/feather_nrf52832/examples/ble_scan.py deleted file mode 100644 index 9cacbe6f42..0000000000 --- a/ports/nrf/boards/feather_nrf52832/examples/ble_scan.py +++ /dev/null @@ -1,26 +0,0 @@ -from ubluepy import Scanner, constants - -def display_scan_results(scan_entries): - for e in scan_entries: - print("ADDR: ", e.addr()) - print("TYPE: ", e.addr_type()) - print("RSSI: ", e.rssi()) - - # Parse the contents of the advertising packet - scan = e.getScanData() - if scan: - for s in scan: - # Convert byte array to hex format string - hex = ' '.join('0x%02X' % b for b in s[2]) - # Display enum value and hex string together - print('\t{}: {}'.format(s[1], hex)) - - # Line break between record sets - print("") - -# Scan 1s for advertising devices in range -s = Scanner() -scan_res = s.scan(1000) - -# Display the scan results -display_scan_results(scan_res) diff --git a/ports/nrf/boards/feather_nrf52832/examples/blinky.py b/ports/nrf/boards/feather_nrf52832/examples/blinky.py deleted file mode 100644 index 29cca26d04..0000000000 --- a/ports/nrf/boards/feather_nrf52832/examples/blinky.py +++ /dev/null @@ -1,12 +0,0 @@ -import board -import digitalio -import time - -led = digitalio.DigitalInOut(board.LED2) -led.direction = digitalio.Direction.OUTPUT - -while True: - led.value = True - time.sleep(0.5) - led.value = False - time.sleep(0.5) diff --git a/ports/nrf/boards/feather_nrf52832/examples/i2c_scan.py b/ports/nrf/boards/feather_nrf52832/examples/i2c_scan.py deleted file mode 100644 index 8e3ef557d1..0000000000 --- a/ports/nrf/boards/feather_nrf52832/examples/i2c_scan.py +++ /dev/null @@ -1,20 +0,0 @@ -import board -import busio - -i2c = busio.I2C(board.SCL, board.SDA) -count = 0 - -# Wait for I2C lock -while not i2c.try_lock(): - pass - -# Scan for devices on the I2C bus -print("Scanning I2C bus") -for x in i2c.scan(): - print(hex(x)) - count += 1 - -print("%d device(s) found on I2C bus" % count) - -# Release the I2C bus -i2c.unlock() diff --git a/ports/nrf/boards/feather_nrf52832/examples/pulseio.py b/ports/nrf/boards/feather_nrf52832/examples/pulseio.py deleted file mode 100644 index cdbe16addd..0000000000 --- a/ports/nrf/boards/feather_nrf52832/examples/pulseio.py +++ /dev/null @@ -1,25 +0,0 @@ -import time -from board import * -from pulseio import * - -# Setup BLUE and RED LEDs as PWM output (default frequency is 500 Hz) -ledb = PWMOut(LED2) -ledr = PWMOut(LED1) - -# Set the BLUE LED to have a duty cycle of 5000 (out of 65535, so ~7.5%) -ledb.duty_cycle = 5000 - -# Setup pin A0 as a standard PWM out @ 50% to test on the oscilloscope. -# You should see a 50% duty cycle waveform at ~500Hz on the scope when you -# connect a probe to pin A0 -a0 = PWMOut(A0) -a0.duty_cycle = int(65535/2) - -# Constantly pulse the RED LED -while True: - for i in range(100): - ledr.duty_cycle = int(i / 100 * 65535) - time.sleep(0.01) - for i in range(100, -1, -1): - ledr.duty_cycle = int(i / 100 * 65535) - time.sleep(0.01) diff --git a/ports/nrf/boards/feather_nrf52832/mpconfigboard.mk b/ports/nrf/boards/feather_nrf52832/mpconfigboard.mk deleted file mode 100644 index 5b1f6e939c..0000000000 --- a/ports/nrf/boards/feather_nrf52832/mpconfigboard.mk +++ /dev/null @@ -1,13 +0,0 @@ -MCU_SERIES = m4 -MCU_VARIANT = nrf52 -# Historical: nrf52 means nrf52832 -MCU_SUB_VARIANT = nrf52 -MCU_CHIP = nrf52832 -SD ?= s132 -SOFTDEV_VERSION ?= 2.0.1 - -LD_FILE = boards/feather_nrf52832/custom_nrf52832_dfu_app_$(SOFTDEV_VERSION).ld -BOOT_FILE = boards/feather_nrf52832/bootloader/feather52_bootloader_$(SOFTDEV_VERSION)_s132_single - -BOOT_SETTING_ADDR = 0x7F000 -NRF_DEFINES += -DNRF52832_XXAA -DNRF52832 diff --git a/ports/nrf/boards/feather_nrf52832/pins.c b/ports/nrf/boards/feather_nrf52832/pins.c deleted file mode 100644 index 48c57defb2..0000000000 --- a/ports/nrf/boards/feather_nrf52832/pins.c +++ /dev/null @@ -1,47 +0,0 @@ -#include "shared-bindings/board/__init__.h" - -#include "board_busses.h" - -STATIC const mp_rom_map_elem_t board_module_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_P0_02) }, - { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_P0_03) }, - { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_P0_04) }, - { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_P0_05) }, - { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_P0_28) }, - { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_P0_29) }, - - { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_P0_12) }, - { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_P0_13) }, - { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_P0_14) }, - - { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_P0_08) }, - { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_P0_06) }, - - { MP_ROM_QSTR(MP_QSTR_DFU), MP_ROM_PTR(&pin_P0_20) }, - - { MP_ROM_QSTR(MP_QSTR_NFC1), MP_ROM_PTR(&pin_P0_09) }, - { MP_ROM_QSTR(MP_QSTR_NFC2), MP_ROM_PTR(&pin_P0_10) }, - - { MP_ROM_QSTR(MP_QSTR_D27), MP_ROM_PTR(&pin_P0_27) }, - - { MP_ROM_QSTR(MP_QSTR_D30), MP_ROM_PTR(&pin_P0_30) }, - { MP_ROM_QSTR(MP_QSTR_A6), MP_ROM_PTR(&pin_P0_30) }, - - { MP_ROM_QSTR(MP_QSTR_D31), MP_ROM_PTR(&pin_P0_31) }, - { MP_ROM_QSTR(MP_QSTR_A7), MP_ROM_PTR(&pin_P0_31) }, - { MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_P0_31) }, - - { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_P0_07) }, - { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_P0_11) }, - { MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_P0_15) }, - { MP_ROM_QSTR(MP_QSTR_D16), MP_ROM_PTR(&pin_P0_16) }, - - { MP_ROM_QSTR(MP_QSTR_L), MP_ROM_PTR(&pin_P0_17) }, - - { MP_ROM_QSTR(MP_QSTR_LED_BLUE), MP_ROM_PTR(&pin_P0_19) }, - - { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_P0_26) }, - { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_P0_25) }, -}; - -MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/nrf/boards/nrf52832_512k_64k.ld b/ports/nrf/boards/nrf52832_512k_64k.ld deleted file mode 100644 index 699811ce86..0000000000 --- a/ports/nrf/boards/nrf52832_512k_64k.ld +++ /dev/null @@ -1,28 +0,0 @@ -/* - GNU linker script for NRF52832 blank w/ no SoftDevice -*/ - -/* Specify the memory areas */ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x080000 /* entire flash, 512 KiB */ - FLASH_ISR (rx) : ORIGIN = 0x00000000, LENGTH = 0x001000 /* sector 0, 4 KiB */ - FLASH_TEXT (rx) : ORIGIN = 0x00001000, LENGTH = 0x066000 /* 408 KiB */ - FLASH_FATFS (r) : ORIGIN = 0x00067000, LENGTH = 0x019000 /* File system 100KB */ - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 0x010000 /* 64 KiB */ -} - -/* produce a link error if there is not this amount of RAM for these sections */ -_minimum_stack_size = 2K; -_minimum_heap_size = 0; - -/* top end of the stack */ - -/*_stack_end = ORIGIN(RAM) + LENGTH(RAM);*/ -_estack = ORIGIN(RAM) + LENGTH(RAM); - -/* RAM extents for the garbage collector */ -_ram_end = ORIGIN(RAM) + LENGTH(RAM); -_heap_end = 0x20008000; /* tunable */ - -INCLUDE "boards/common.ld" diff --git a/ports/nrf/boards/nrf52832_512k_64k_s132_2.0.1.ld b/ports/nrf/boards/nrf52832_512k_64k_s132_2.0.1.ld deleted file mode 100644 index dbff5f987f..0000000000 --- a/ports/nrf/boards/nrf52832_512k_64k_s132_2.0.1.ld +++ /dev/null @@ -1,28 +0,0 @@ -/* - GNU linker script for NRF52 w/ s132 2.0.1 SoftDevice -*/ - -/* Specify the memory areas */ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x080000 /* entire flash, 512 KiB */ - FLASH_ISR (rx) : ORIGIN = 0x0001c000, LENGTH = 0x001000 /* sector 0, 4 KiB */ - FLASH_TEXT (rx) : ORIGIN = 0x0001d000, LENGTH = 0x04A000 /* 296 KiB */ - FLASH_FATFS (r) : ORIGIN = 0x00067000, LENGTH = 0x019000 /* File system 100KB */ - RAM (xrw) : ORIGIN = 0x200039c0, LENGTH = 0x0c640 /* 49.5 KiB, give 8KiB headroom for softdevice */ -} - -/* produce a link error if there is not this amount of RAM for these sections */ -_minimum_stack_size = 2K; -_minimum_heap_size = 0; - -/* top end of the stack */ - -/*_stack_end = ORIGIN(RAM) + LENGTH(RAM);*/ -_estack = ORIGIN(RAM) + LENGTH(RAM); - -/* RAM extents for the garbage collector */ -_ram_end = ORIGIN(RAM) + LENGTH(RAM); -_heap_end = 0x20007000; /* tunable */ - -INCLUDE "boards/common.ld" diff --git a/ports/nrf/boards/nrf52832_512k_64k_s132_5.0.0.ld b/ports/nrf/boards/nrf52832_512k_64k_s132_5.0.0.ld deleted file mode 100644 index 6d5fe63c91..0000000000 --- a/ports/nrf/boards/nrf52832_512k_64k_s132_5.0.0.ld +++ /dev/null @@ -1,28 +0,0 @@ -/* - GNU linker script for NRF52 w/ s132 2.0.1 SoftDevice -*/ - -/* Specify the memory areas */ -MEMORY -{ - FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x080000 /* entire flash, 512 KiB */ - FLASH_ISR (rx) : ORIGIN = 0x00023000, LENGTH = 0x001000 /* sector 0, 4 KiB */ - FLASH_TEXT (rx) : ORIGIN = 0x00024000, LENGTH = 0x043000 /* 268 KiB */ - FLASH_FATFS (r) : ORIGIN = 0x00067000, LENGTH = 0x019000 /* File system 100KB */ - RAM (xrw) : ORIGIN = 0x200039c0, LENGTH = 0x0c640 /* 49.5 KiB, give 8KiB headroom for softdevice */ -} - -/* produce a link error if there is not this amount of RAM for these sections */ -_minimum_stack_size = 2K; -_minimum_heap_size = 0; - -/* top end of the stack */ - -/*_stack_end = ORIGIN(RAM) + LENGTH(RAM);*/ -_estack = ORIGIN(RAM) + LENGTH(RAM); - -/* RAM extents for the garbage collector */ -_ram_end = ORIGIN(RAM) + LENGTH(RAM); -_heap_end = 0x20007000; /* tunable */ - -INCLUDE "boards/common.ld" diff --git a/ports/nrf/boards/pca10040/mpconfigboard.mk b/ports/nrf/boards/pca10040/mpconfigboard.mk deleted file mode 100644 index ad11b4f7c7..0000000000 --- a/ports/nrf/boards/pca10040/mpconfigboard.mk +++ /dev/null @@ -1,15 +0,0 @@ -MCU_SERIES = m4 -MCU_VARIANT = nrf52 -# Historical: nrf52 means nrf52832 -MCU_SUB_VARIANT = nrf52 -MCU_CHIP = nrf52832 -SD ?= s132 -SOFTDEV_VERSION ?= 5.0.0 - -ifeq ($(SD),) - LD_FILE = boards/nrf52832_512k_64k.ld -else - LD_FILE = boards/nrf52832_512k_64k_s132_$(SOFTDEV_VERSION).ld -endif - -NRF_DEFINES += -DNRF52832_XXAA -DNRF52832 diff --git a/ports/nrf/boards/pca10040/pins.c b/ports/nrf/boards/pca10040/pins.c deleted file mode 100644 index 95acd8ffdf..0000000000 --- a/ports/nrf/boards/pca10040/pins.c +++ /dev/null @@ -1,44 +0,0 @@ -#include "shared-bindings/board/__init__.h" - -#include "board_busses.h" - -STATIC const mp_rom_map_elem_t board_module_globals_table[] = { - { MP_ROM_QSTR(MP_QSTR_P0_00), MP_ROM_PTR(&pin_P0_00) }, - { MP_ROM_QSTR(MP_QSTR_P0_01), MP_ROM_PTR(&pin_P0_01) }, - { MP_ROM_QSTR(MP_QSTR_P0_02), MP_ROM_PTR(&pin_P0_02) }, - { MP_ROM_QSTR(MP_QSTR_P0_03), MP_ROM_PTR(&pin_P0_03) }, - { MP_ROM_QSTR(MP_QSTR_P0_04), MP_ROM_PTR(&pin_P0_04) }, - { MP_ROM_QSTR(MP_QSTR_P0_05), MP_ROM_PTR(&pin_P0_05) }, - { MP_ROM_QSTR(MP_QSTR_P0_06), MP_ROM_PTR(&pin_P0_06) }, - { MP_ROM_QSTR(MP_QSTR_P0_07), MP_ROM_PTR(&pin_P0_07) }, - { MP_ROM_QSTR(MP_QSTR_P0_08), MP_ROM_PTR(&pin_P0_08) }, - { MP_ROM_QSTR(MP_QSTR_P0_09), MP_ROM_PTR(&pin_P0_09) }, - { MP_ROM_QSTR(MP_QSTR_P0_10), MP_ROM_PTR(&pin_P0_10) }, - { MP_ROM_QSTR(MP_QSTR_P0_11), MP_ROM_PTR(&pin_P0_11) }, - { MP_ROM_QSTR(MP_QSTR_P0_12), MP_ROM_PTR(&pin_P0_12) }, - { MP_ROM_QSTR(MP_QSTR_P0_13), MP_ROM_PTR(&pin_P0_13) }, - { MP_ROM_QSTR(MP_QSTR_P0_14), MP_ROM_PTR(&pin_P0_14) }, - { MP_ROM_QSTR(MP_QSTR_P0_15), MP_ROM_PTR(&pin_P0_15) }, - { MP_ROM_QSTR(MP_QSTR_P0_16), MP_ROM_PTR(&pin_P0_16) }, - { MP_ROM_QSTR(MP_QSTR_P0_17), MP_ROM_PTR(&pin_P0_17) }, - { MP_ROM_QSTR(MP_QSTR_LED1), MP_ROM_PTR(&pin_P0_17) }, - { MP_ROM_QSTR(MP_QSTR_P0_18), MP_ROM_PTR(&pin_P0_18) }, - { MP_ROM_QSTR(MP_QSTR_LED2), MP_ROM_PTR(&pin_P0_18) }, - { MP_ROM_QSTR(MP_QSTR_P0_19), MP_ROM_PTR(&pin_P0_19) }, - { MP_ROM_QSTR(MP_QSTR_LED3), MP_ROM_PTR(&pin_P0_19) }, - { MP_ROM_QSTR(MP_QSTR_P0_20), MP_ROM_PTR(&pin_P0_20) }, - { MP_ROM_QSTR(MP_QSTR_LED4), MP_ROM_PTR(&pin_P0_20) }, - { MP_ROM_QSTR(MP_QSTR_P0_21), MP_ROM_PTR(&pin_P0_21) }, - { MP_ROM_QSTR(MP_QSTR_P0_22), MP_ROM_PTR(&pin_P0_22) }, - { MP_ROM_QSTR(MP_QSTR_P0_23), MP_ROM_PTR(&pin_P0_23) }, - { MP_ROM_QSTR(MP_QSTR_P0_24), MP_ROM_PTR(&pin_P0_24) }, - { MP_ROM_QSTR(MP_QSTR_P0_25), MP_ROM_PTR(&pin_P0_25) }, - { MP_ROM_QSTR(MP_QSTR_P0_26), MP_ROM_PTR(&pin_P0_26) }, - { MP_ROM_QSTR(MP_QSTR_P0_27), MP_ROM_PTR(&pin_P0_27) }, - { MP_ROM_QSTR(MP_QSTR_P0_28), MP_ROM_PTR(&pin_P0_28) }, - { MP_ROM_QSTR(MP_QSTR_P0_29), MP_ROM_PTR(&pin_P0_29) }, - { MP_ROM_QSTR(MP_QSTR_P0_30), MP_ROM_PTR(&pin_P0_30) }, - { MP_ROM_QSTR(MP_QSTR_P0_31), MP_ROM_PTR(&pin_P0_31) }, -}; - -MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/nrf/common-hal/bleio/Adapter.c b/ports/nrf/common-hal/bleio/Adapter.c index 985e262e49..cd116711eb 100644 --- a/ports/nrf/common-hal/bleio/Adapter.c +++ b/ports/nrf/common-hal/bleio/Adapter.c @@ -33,28 +33,22 @@ #include "nrfx_power.h" #include "nrf_nvic.h" #include "nrf_sdm.h" -#include "py/nlr.h" +#include "py/runtime.h" #include "shared-bindings/bleio/Adapter.h" STATIC void softdevice_assert_handler(uint32_t id, uint32_t pc, uint32_t info) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_AssertionError, - translate("Soft device assert, id: 0x%08lX, pc: 0x%08lX"), id, pc)); + mp_raise_msg_varg(&mp_type_AssertionError, + translate("Soft device assert, id: 0x%08lX, pc: 0x%08lX"), id, pc); } STATIC uint32_t ble_stack_enable(void) { nrf_clock_lf_cfg_t clock_config = { .source = NRF_CLOCK_LF_SRC_XTAL, -#if (BLE_API_VERSION == 4) .accuracy = NRF_CLOCK_LF_ACCURACY_20_PPM -#else - .xtal_accuracy = NRF_CLOCK_LF_XTAL_ACCURACY_20_PPM -#endif }; -#if (BLUETOOTH_SD == 140) // The SD takes over the POWER IRQ and will fail if the IRQ is already in use nrfx_power_uninit(); -#endif uint32_t err_code = sd_softdevice_enable(&clock_config, softdevice_assert_handler); if (err_code != NRF_SUCCESS) @@ -64,17 +58,10 @@ STATIC uint32_t ble_stack_enable(void) { if (err_code != NRF_SUCCESS) return err_code; - uint32_t app_ram_start; -#if (BLE_API_VERSION == 2) - ble_enable_params_t ble_enable_params = { - .gatts_enable_params.attr_tab_size = BLE_GATTS_ATTR_TAB_SIZE_DEFAULT, - .gap_enable_params.central_conn_count = 1, - .gap_enable_params.periph_conn_count = 1, - }; + // Start with no event handlers, etc. + ble_drv_reset(); - app_ram_start = 0x200039c0; - err_code = sd_ble_enable(&ble_enable_params, &app_ram_start); -#else + uint32_t app_ram_start; app_ram_start = 0x20004000; ble_cfg_t ble_conf; @@ -100,7 +87,6 @@ STATIC uint32_t ble_stack_enable(void) { return err_code; err_code = sd_ble_enable(&app_ram_start); -#endif return err_code; } @@ -121,8 +107,7 @@ void common_hal_bleio_adapter_set_enabled(bool enabled) { } if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to change softdevice state, error: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to change softdevice state")); } } @@ -131,8 +116,7 @@ bool common_hal_bleio_adapter_get_enabled(void) { const uint32_t err_code = sd_softdevice_is_enabled(&is_enabled); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to get softdevice state, error: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to get softdevice state")); } return is_enabled; @@ -151,8 +135,7 @@ void common_hal_bleio_adapter_get_address(bleio_address_obj_t *address) { #endif if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to get local address, error: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to get local address")); } address->type = local_address.addr_type; diff --git a/ports/nrf/common-hal/bleio/Broadcaster.c b/ports/nrf/common-hal/bleio/Broadcaster.c new file mode 100644 index 0000000000..a70209a7fc --- /dev/null +++ b/ports/nrf/common-hal/bleio/Broadcaster.c @@ -0,0 +1,98 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include + +#include "ble.h" +#include "ble_drv.h" +#include "ble_hci.h" +#include "nrf_soc.h" +#include "py/runtime.h" + +#include "common-hal/bleio/Broadcaster.h" +#include "shared-bindings/bleio/Adapter.h" +#include "shared-bindings/bleio/Broadcaster.h" + +static uint8_t m_adv_handle = BLE_GAP_ADV_SET_HANDLE_NOT_SET; + +void common_hal_bleio_broadcaster_construct(bleio_broadcaster_obj_t *self, mp_float_t interval) { + common_hal_bleio_adapter_set_enabled(true); // TODO -- Do this somewhere else maybe bleio __init__ + const mp_float_t min = BLE_GAP_ADV_INTERVAL_MIN * ADV_INTERVAL_UNIT_FLOAT_SECS; + const mp_float_t max = BLE_GAP_ADV_INTERVAL_MAX * ADV_INTERVAL_UNIT_FLOAT_SECS; + + if (interval < min || interval > max) { + // Would like to print range using the constants above, but vargs would convert to double. + mp_raise_ValueError(translate("interval not in range 0.0020 to 10.24")); + } + self->interval = interval; +} + + +void common_hal_bleio_broadcaster_start_advertising(bleio_broadcaster_obj_t *self, mp_buffer_info_t *data) { + uint32_t err_code; + + if (data->len >= BLE_GAP_ADV_SET_DATA_SIZE_MAX) { + mp_raise_ValueError(translate("Data too large for advertisement packet")); + } + memcpy(self->adv_data, data->buf, data->len); + + ble_gap_adv_params_t m_adv_params = { + .interval = (uint32_t) (self->interval / ADV_INTERVAL_UNIT_FLOAT_SECS), + .properties.type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_SCANNABLE_UNDIRECTED, + .duration = BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED, + .filter_policy = BLE_GAP_ADV_FP_ANY, + .primary_phy = BLE_GAP_PHY_1MBPS, + }; + + common_hal_bleio_broadcaster_stop_advertising(self); + + const ble_gap_adv_data_t ble_gap_adv_data = { + .adv_data.p_data = self->adv_data, + .adv_data.len = data->len, + }; + + err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &ble_gap_adv_data, &m_adv_params); + if (err_code == NRF_SUCCESS) { + err_code = sd_ble_gap_adv_start(m_adv_handle, BLE_CONN_CFG_TAG_CUSTOM); + } + + if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Failed to start advertising, err 0x%04x"), err_code); + } +} + +void common_hal_bleio_broadcaster_stop_advertising(bleio_broadcaster_obj_t *self) { + + if (m_adv_handle == BLE_GAP_ADV_SET_HANDLE_NOT_SET) { + return; + } + + const uint32_t err_code = sd_ble_gap_adv_stop(m_adv_handle); + + if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_INVALID_STATE)) { + mp_raise_OSError_msg_varg(translate("Failed to stop advertising, err 0x%04x"), err_code); + } +} diff --git a/ports/nrf/common-hal/bleio/Broadcaster.h b/ports/nrf/common-hal/bleio/Broadcaster.h new file mode 100644 index 0000000000..72f93a4431 --- /dev/null +++ b/ports/nrf/common-hal/bleio/Broadcaster.h @@ -0,0 +1,47 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Artur Pacholec + * Copyright (c) 2018 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_COMMON_HAL_BLEIO_BROADCASTER_H +#define MICROPY_INCLUDED_COMMON_HAL_BLEIO_BROADCASTER_H + +#include "ble.h" + +#include "shared-module/bleio/__init__.h" +#include "shared-module/bleio/Address.h" + +typedef struct { + mp_obj_base_t base; + // In seconds. + mp_float_t interval; + // The advertising data buffer is held by us, not by the SD, so we must + // maintain it and not change it. If we need to change its contents during advertising, + // there are tricks to get the SD to notice (see DevZone - TBS). + uint8_t adv_data[BLE_GAP_ADV_SET_DATA_SIZE_MAX]; + +} bleio_broadcaster_obj_t; + +#endif // MICROPY_INCLUDED_COMMON_HAL_BLEIO_BROADCASTER_H diff --git a/ports/nrf/common-hal/bleio/Characteristic.c b/ports/nrf/common-hal/bleio/Characteristic.c index 246c350057..0bade8d015 100644 --- a/ports/nrf/common-hal/bleio/Characteristic.c +++ b/ports/nrf/common-hal/bleio/Characteristic.c @@ -30,16 +30,71 @@ #include "ble_drv.h" #include "ble_gatts.h" #include "nrf_soc.h" -#include "py/nlr.h" + +#include "py/runtime.h" +#include "common-hal/bleio/__init__.h" +#include "common-hal/bleio/Characteristic.h" #include "shared-module/bleio/Characteristic.h" -static volatile bleio_characteristic_obj_t *m_read_characteristic; -static volatile uint8_t m_tx_in_progress; -static nrf_mutex_t *m_write_mutex; +// TODO - should these be per object?? ***** +STATIC volatile bleio_characteristic_obj_t *m_read_characteristic; +STATIC volatile uint8_t m_tx_in_progress; +STATIC nrf_mutex_t *m_write_mutex; + +STATIC uint16_t get_cccd(bleio_characteristic_obj_t *characteristic) { + const uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(characteristic->service->device); + uint16_t cccd; + ble_gatts_value_t value = { + .p_value = (uint8_t*) &cccd, + .len = 2, + }; + + const uint32_t err_code = sd_ble_gatts_value_get(conn_handle, characteristic->cccd_handle, &value); + + + if (err_code == BLE_ERROR_GATTS_SYS_ATTR_MISSING) { + // CCCD is not set, so say that neither Notify nor Indicate is enabled. + cccd = 0; + } else if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Failed to read CCCD value, err 0x%04x"), err_code); + } + + return cccd; +} + +STATIC void gatts_read(bleio_characteristic_obj_t *characteristic) { + // This might be BLE_CONN_HANDLE_INVALID if we're not conected, but that's OK, because + // we can still read and write the local value. + const uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(characteristic->service->device); + + mp_buffer_info_t bufinfo; + ble_gatts_value_t gatts_value = { + .p_value = NULL, + .len = 0, + }; + + // Read once to find out what size buffer we need, then read again to fill buffer. + + uint32_t err_code = sd_ble_gatts_value_get(conn_handle, characteristic->handle, &gatts_value); + if (err_code == NRF_SUCCESS) { + characteristic->value_data = mp_obj_new_bytearray_of_zeros(gatts_value.len); + mp_get_buffer_raise(characteristic->value_data, &bufinfo, MP_BUFFER_WRITE); + gatts_value.p_value = bufinfo.buf; + + // Read again, with the correct size of buffer. + err_code = sd_ble_gatts_value_get(conn_handle, characteristic->handle, &gatts_value); + } + + if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Failed to read gatts value, err 0x%04x"), err_code); + } +} + STATIC void gatts_write(bleio_characteristic_obj_t *characteristic, mp_buffer_info_t *bufinfo) { - bleio_device_obj_t *device = characteristic->service->device; - const uint16_t conn_handle = device->conn_handle; + // This might be BLE_CONN_HANDLE_INVALID if we're not conected, but that's OK, because + // we can still read and write the local value. + const uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(characteristic->service->device); ble_gatts_value_t gatts_value = { .p_value = bufinfo->buf, @@ -48,18 +103,17 @@ STATIC void gatts_write(bleio_characteristic_obj_t *characteristic, mp_buffer_in const uint32_t err_code = sd_ble_gatts_value_set(conn_handle, characteristic->handle, &gatts_value); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to write gatts value, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg_varg(translate("Failed to write gatts value, err 0x%04x"), err_code); } } -STATIC void gatts_notify(bleio_characteristic_obj_t *characteristic, mp_buffer_info_t *bufinfo) { - bleio_device_obj_t *device = characteristic->service->device; +STATIC void gatts_notify_indicate(bleio_characteristic_obj_t *characteristic, mp_buffer_info_t *bufinfo, uint16_t hvx_type) { uint16_t hvx_len = bufinfo->len; ble_gatts_hvx_params_t hvx_params = { .handle = characteristic->handle, - .type = BLE_GATT_HVX_NOTIFICATION, + .type = hvx_type, + .offset = 0, .p_len = &hvx_len, .p_data = bufinfo->buf, }; @@ -70,27 +124,27 @@ STATIC void gatts_notify(bleio_characteristic_obj_t *characteristic, mp_buffer_i #endif } - const uint32_t err_code = sd_ble_gatts_hvx(device->conn_handle, &hvx_params); + const uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(characteristic->service->device); + m_tx_in_progress++; + const uint32_t err_code = sd_ble_gatts_hvx(conn_handle, &hvx_params); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to notify attribute value, status: 0x%08lX"), err_code)); + m_tx_in_progress--; + mp_raise_OSError_msg_varg(translate("Failed to notify or indicate attribute value, err %0x04x"), err_code); } - m_tx_in_progress += 1; } STATIC void gattc_read(bleio_characteristic_obj_t *characteristic) { - bleio_service_obj_t *service = characteristic->service; - bleio_device_obj_t *device = service->device; + const uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(characteristic->service->device); m_read_characteristic = characteristic; - const uint32_t err_code = sd_ble_gattc_read(device->conn_handle, characteristic->handle, 0); + const uint32_t err_code = sd_ble_gattc_read(conn_handle, characteristic->handle, 0); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to read attribute value, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg_varg(translate("Failed to read attribute value, err %0x04x"), err_code); } +// while (m_read_characteristic != NULL) { #ifdef MICROPY_VM_HOOK_LOOP MICROPY_VM_HOOK_LOOP @@ -99,7 +153,7 @@ STATIC void gattc_read(bleio_characteristic_obj_t *characteristic) { } STATIC void gattc_write(bleio_characteristic_obj_t *characteristic, mp_buffer_info_t *bufinfo) { - bleio_device_obj_t *device = characteristic->service->device; + const uint16_t conn_handle = common_hal_bleio_device_get_conn_handle(characteristic->service->device); uint32_t err_code; ble_gattc_write_params_t write_params = { @@ -110,20 +164,18 @@ STATIC void gattc_write(bleio_characteristic_obj_t *characteristic, mp_buffer_in .len = bufinfo->len, }; - if (characteristic->props.write_wo_resp) { + if (characteristic->props.write_no_response) { write_params.write_op = BLE_GATT_OP_WRITE_CMD; err_code = sd_mutex_acquire(m_write_mutex); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to acquire mutex, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg_varg(translate("Failed to acquire mutex, err 0x%04x"), err_code); } } - err_code = sd_ble_gattc_write(device->conn_handle, &write_params); + err_code = sd_ble_gattc_write(conn_handle, &write_params); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to write attribute value, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg_varg(translate("Failed to write attribute value, err 0x%04x"), err_code); } while (sd_mutex_acquire(m_write_mutex) == NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN) { @@ -134,58 +186,102 @@ STATIC void gattc_write(bleio_characteristic_obj_t *characteristic, mp_buffer_in err_code = sd_mutex_release(m_write_mutex); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to release mutex, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg_varg(translate("Failed to release mutex, err 0x%04x"), err_code); } } -STATIC void on_ble_evt(ble_evt_t *ble_evt, void *param) { +STATIC void characteristic_on_ble_evt(ble_evt_t *ble_evt, void *param) { switch (ble_evt->header.evt_id) { -#if (BLE_API_VERSION == 4) - case BLE_GATTS_EVT_HVN_TX_COMPLETE: - m_tx_in_progress -= ble_evt->evt.gatts_evt.params.hvn_tx_complete.count; - break; -#else - case BLE_EVT_TX_COMPLETE: - m_tx_in_progress -= ble_evt->evt.common_evt.params.tx_complete.count; - break; -#endif - - case BLE_GATTC_EVT_READ_RSP: - { - ble_gattc_evt_read_rsp_t *response = &ble_evt->evt.gattc_evt.params.read_rsp; - m_read_characteristic->value_data = mp_obj_new_bytearray(response->len, response->data); - m_read_characteristic = NULL; - break; + case BLE_GATTS_EVT_HVN_TX_COMPLETE: + { + uint8_t count = ble_evt->evt.gatts_evt.params.hvn_tx_complete.count; + // Don't underflow the count. + if (count >= m_tx_in_progress) { + m_tx_in_progress = 0; + } else { + m_tx_in_progress -= count; } + break; + } - case BLE_GATTC_EVT_WRITE_RSP: - sd_mutex_release(m_write_mutex); -// m_write_done = true; - break; + case BLE_GATTC_EVT_READ_RSP: + { + ble_gattc_evt_read_rsp_t *response = &ble_evt->evt.gattc_evt.params.read_rsp; + m_read_characteristic->value_data = mp_obj_new_bytearray(response->len, response->data); + // Flag to busy-wait loop that we've read the characteristic. + m_read_characteristic = NULL; + break; + } + + case BLE_GATTC_EVT_WRITE_RSP: + // Someone else can write now. + sd_mutex_release(m_write_mutex); + break; + + // For debugging. + default: + // mp_printf(&mp_plat_print, "Unhandled characteristic event: 0x%04x\n", ble_evt->header.evt_id); + break; + } + +} + +void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self, bleio_uuid_obj_t *uuid, bleio_characteristic_properties_t props) { + self->service = NULL; + self->uuid = uuid; + self->value_data = NULL; + self->props = props; + self->handle = BLE_GATT_HANDLE_INVALID; + + ble_drv_add_event_handler(characteristic_on_ble_evt, self); + +} + +void common_hal_bleio_characteristic_get_value(bleio_characteristic_obj_t *self) { + switch (common_hal_bleio_device_get_gatt_role(self->service->device)) { + case GATT_ROLE_CLIENT: + gattc_read(self); + break; + + case GATT_ROLE_SERVER: + gatts_read(self); + break; + + default: + mp_raise_RuntimeError(translate("bad GATT role")); + break; } } -void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self) { - ble_drv_add_event_handler(on_ble_evt, NULL); -} +void common_hal_bleio_characteristic_set_value(bleio_characteristic_obj_t *self, mp_buffer_info_t *bufinfo) { + bool sent = false; + uint16_t cccd = 0; -void common_hal_bleio_characteristic_read_value(bleio_characteristic_obj_t *self) { - gattc_read(self); -} - -void common_hal_bleio_characteristic_write_value(bleio_characteristic_obj_t *self, mp_buffer_info_t *bufinfo) { - const bleio_device_obj_t *device = self->service->device; - - if (device->is_peripheral) { - // TODO: Add indications - if (self->props.notify) { - gatts_notify(self, bufinfo); - } else { + switch (common_hal_bleio_device_get_gatt_role(self->service->device)) { + case GATT_ROLE_SERVER: + if (self->props.notify || self->props.indicate) { + cccd = get_cccd(self); + } + // It's possible that both notify and indicate are set. + if (self->props.notify && (cccd & BLE_GATT_HVX_NOTIFICATION)) { + gatts_notify_indicate(self, bufinfo, BLE_GATT_HVX_NOTIFICATION); + sent = true; + } + if (self->props.indicate && (cccd & BLE_GATT_HVX_INDICATION)) { + gatts_notify_indicate(self, bufinfo, BLE_GATT_HVX_INDICATION); + sent = true; + } + if (!sent) { gatts_write(self, bufinfo); } - } else { - gattc_write(self, bufinfo); - } + break; + case GATT_ROLE_CLIENT: + gattc_write(self, bufinfo); + break; + + default: + mp_raise_RuntimeError(translate("bad GATT role")); + break; + } } diff --git a/shared-bindings/bleio/UUIDType.h b/ports/nrf/common-hal/bleio/Characteristic.h similarity index 65% rename from shared-bindings/bleio/UUIDType.h rename to ports/nrf/common-hal/bleio/Characteristic.h index 87bbf9b531..bce1eec1d3 100644 --- a/shared-bindings/bleio/UUIDType.h +++ b/ports/nrf/common-hal/bleio/Characteristic.h @@ -1,5 +1,5 @@ /* - * This file is part of the Micro Python project, http://micropython.org/ + * This file is part of the MicroPython project, http://micropython.org/ * * The MIT License (MIT) * @@ -24,23 +24,23 @@ * THE SOFTWARE. */ -#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_UUIDTYPE_H -#define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_UUIDTYPE_H +#ifndef MICROPY_INCLUDED_COMMON_HAL_BLEIO_CHARACTERISTIC_H +#define MICROPY_INCLUDED_COMMON_HAL_BLEIO_CHARACTERISTIC_H -#include "py/obj.h" - -typedef enum { - UUID_TYPE_16BIT, - UUID_TYPE_128BIT -} bleio_uuid_type_t; - -extern const mp_obj_type_t bleio_uuidtype_type; +#include "shared-module/bleio/Characteristic.h" +#include "shared-module/bleio/Service.h" +#include "common-hal/bleio/UUID.h" typedef struct { mp_obj_base_t base; -} bleio_uuidtype_obj_t; + bleio_service_obj_t *service; + bleio_uuid_obj_t *uuid; + mp_obj_t value_data; + uint16_t handle; + bleio_characteristic_properties_t props; + uint16_t user_desc_handle; + uint16_t cccd_handle; + uint16_t sccd_handle; +} bleio_characteristic_obj_t; -extern const bleio_uuidtype_obj_t bleio_uuidtype_16bit_obj; -extern const bleio_uuidtype_obj_t bleio_uuidtype_128bit_obj; - -#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_UUIDTYPE_H +#endif // MICROPY_INCLUDED_COMMON_HAL_BLEIO_CHARACTERISTIC_H diff --git a/ports/nrf/common-hal/bleio/CharacteristicBuffer.c b/ports/nrf/common-hal/bleio/CharacteristicBuffer.c new file mode 100644 index 0000000000..4bd3e147ff --- /dev/null +++ b/ports/nrf/common-hal/bleio/CharacteristicBuffer.c @@ -0,0 +1,75 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Artur Pacholec + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include +#include + +#include "ble_drv.h" +#include "ble_gatts.h" +#include "nrf_soc.h" + +#include "py/runtime.h" + +#include "common-hal/bleio/__init__.h" +#include "common-hal/bleio/CharacteristicBuffer.h" + +STATIC void characteristic_buffer_on_ble_evt(ble_evt_t *ble_evt, void *param) { + bleio_characteristic_buffer_obj_t *self = (bleio_characteristic_buffer_obj_t *) param; + switch (ble_evt->header.evt_id) { + case BLE_GATTS_EVT_WRITE: { + ble_gatts_evt_write_t *evt_write = &ble_evt->evt.gatts_evt.params.write; + // Event handle must match the handle for my characteristic. + if (evt_write->handle == self->characteristic->handle) { + // Push all the data onto the ring buffer. + for (size_t i = 0; i < evt_write->len; i++) { + ringbuf_put(&self->ringbuf, evt_write->data[i]); + } + break; + } + } + } + +} + +// Assumes that buffer_size has been validated before call. +void common_hal_bleio_characteristic_buffer_construct(bleio_characteristic_buffer_obj_t *self, bleio_characteristic_obj_t *characteristic, size_t buffer_size) { + + self->characteristic = characteristic; + // This is a macro. + ringbuf_alloc(&self->ringbuf, buffer_size); + + ble_drv_add_event_handler(characteristic_buffer_on_ble_evt, self); + +} + +// Returns a uint8_t byte value, or -1 if no data is available. +int common_hal_bleio_characteristic_buffer_read(bleio_characteristic_buffer_obj_t *self) { + return ringbuf_get(&self->ringbuf); +} + +void common_hal_bleio_characteristic_buffer_deinit(bleio_characteristic_buffer_obj_t *self) { + ble_drv_remove_event_handler(characteristic_buffer_on_ble_evt, self); +} diff --git a/ports/nrf/boards/feather_nrf52832/board.c b/ports/nrf/common-hal/bleio/CharacteristicBuffer.h similarity index 69% rename from ports/nrf/boards/feather_nrf52832/board.c rename to ports/nrf/common-hal/bleio/CharacteristicBuffer.h index 29ee2fdcdb..f9ff7dd66d 100644 --- a/ports/nrf/boards/feather_nrf52832/board.c +++ b/ports/nrf/common-hal/bleio/CharacteristicBuffer.h @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries + * Copyright (c) 2018 Artur Pacholec * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,19 +24,18 @@ * THE SOFTWARE. */ -#include -#include +#ifndef MICROPY_INCLUDED_COMMON_HAL_BLEIO_CHARACTERISTICBUFFER_H +#define MICROPY_INCLUDED_COMMON_HAL_BLEIO_CHARACTERISTICBUFFER_H -#include "nrf.h" +#include "py/ringbuf.h" -#include "boards/board.h" +#include "shared-bindings/bleio/Characteristic.h" -void board_init(void) { -} +typedef struct { + mp_obj_base_t base; + bleio_characteristic_obj_t *characteristic; + // Ring buffer storing consecutive incoming values. + ringbuf_t ringbuf; +} bleio_characteristic_buffer_obj_t; -bool board_requests_safe_mode(void) { - return false; -} - -void reset_board(void) { -} +#endif // MICROPY_INCLUDED_COMMON_HAL_BLEIO_CHARACTERISTICBUFFER_H diff --git a/ports/nrf/common-hal/bleio/Descriptor.c b/ports/nrf/common-hal/bleio/Descriptor.c index 9b61345fa8..8282be8f2d 100644 --- a/ports/nrf/common-hal/bleio/Descriptor.c +++ b/ports/nrf/common-hal/bleio/Descriptor.c @@ -26,20 +26,17 @@ */ #include "common-hal/bleio/Descriptor.h" +#include "shared-bindings/bleio/UUID.h" void common_hal_bleio_descriptor_construct(bleio_descriptor_obj_t *self, bleio_uuid_obj_t *uuid) { + // TODO: set handle ??? self->uuid = uuid; } -void common_hal_bleio_descriptor_print(bleio_descriptor_obj_t *self, const mp_print_t *print) { - mp_printf(print, "Descriptor(uuid: 0x" HEX2_FMT HEX2_FMT ")", - self->uuid->value[1], self->uuid->value[0]); -} - mp_int_t common_hal_bleio_descriptor_get_handle(bleio_descriptor_obj_t *self) { return self->handle; } -mp_int_t common_hal_bleio_descriptor_get_uuid(bleio_descriptor_obj_t *self) { - return self->uuid->value[0] | (self->uuid->value[1] << 8); +mp_obj_t common_hal_bleio_descriptor_get_uuid(bleio_descriptor_obj_t *self) { + return MP_OBJ_FROM_PTR(self->uuid); } diff --git a/ports/nrf/common-hal/bleio/Device.c b/ports/nrf/common-hal/bleio/Device.c index 2c000ae2e1..50c738abee 100644 --- a/ports/nrf/common-hal/bleio/Device.c +++ b/ports/nrf/common-hal/bleio/Device.c @@ -77,8 +77,7 @@ STATIC uint32_t set_advertisement_data(bleio_device_obj_t *device, bool connecta #define ADD_FIELD(field, len) \ do { \ if (byte_pos + (len) > BLE_GAP_ADV_MAX_SIZE) { \ - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, \ - translate("Can not fit data into the advertisment packet"))); \ + mp_raise_ValueError(translate("Data too large for the advertisement packet")); \ } \ adv_data[byte_pos] = (field); \ byte_pos += (len); \ @@ -110,8 +109,7 @@ STATIC uint32_t set_advertisement_data(bleio_device_obj_t *device, bool connecta ADD_FIELD(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE, BLE_AD_TYPE_FLAGS_DATA_SIZE); } else { if (byte_pos + raw_data->len > BLE_GAP_ADV_MAX_SIZE) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Can not fit data into the advertisment packet"))); + mp_raise_ValueError(translate("Data too large for the advertisement packet")); } memcpy(&adv_data[byte_pos], raw_data->buf, raw_data->len); @@ -130,12 +128,13 @@ STATIC uint32_t set_advertisement_data(bleio_device_obj_t *device, bool connecta continue; } - if (service->uuid->type == UUID_TYPE_16BIT) { + switch (common_hal_bleio_uuid_get_size(service->uuid)) { + case 16: has_16bit_services = true; - } - - if (service->uuid->type == UUID_TYPE_128BIT) { + break; + case 128: has_128bit_services = true; + break; } } @@ -152,13 +151,12 @@ STATIC uint32_t set_advertisement_data(bleio_device_obj_t *device, bool connecta const bleio_service_obj_t *service = MP_OBJ_TO_PTR(service_list->items[i]); uint8_t encoded_size = 0; - if ((service->uuid->type != UUID_TYPE_16BIT) || service->is_secondary) { + if (common_hal_bleio_uuid_get_size(service->uuid) != 16 || service->is_secondary) { continue; } ble_uuid_t uuid; - uuid.type = BLE_UUID_TYPE_BLE; - uuid.uuid = service->uuid->value[0] | (service->uuid->value[1] << 8); + bleio_uuid_convert_to_nrf_ble_uuid(service->uuid, &uuid); err_code = sd_ble_uuid_encode(&uuid, &encoded_size, &adv_data[byte_pos]); if (err_code != NRF_SUCCESS) { @@ -185,13 +183,12 @@ STATIC uint32_t set_advertisement_data(bleio_device_obj_t *device, bool connecta const bleio_service_obj_t *service = MP_OBJ_TO_PTR(service_list->items[i]); uint8_t encoded_size = 0; - if ((service->uuid->type != UUID_TYPE_128BIT) || service->is_secondary) { + if (common_hal_bleio_uuid_get_size(service->uuid) != 16 || service->is_secondary) { continue; } ble_uuid_t uuid; - uuid.type = service->uuid->uuid_vs_idx; - uuid.uuid = service->uuid->value[0] | (service->uuid->value[1] << 8); + bleio_uuid_convert_to_nrf_ble_uuid(service->uuid, &uuid); err_code = sd_ble_uuid_encode(&uuid, &encoded_size, &adv_data[byte_pos]); if (err_code != NRF_SUCCESS) { @@ -262,14 +259,12 @@ STATIC bool discover_services(bleio_device_obj_t *device, uint16_t start_handle) uint32_t err_code = sd_ble_gattc_primary_services_discover(device->conn_handle, start_handle, NULL); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to discover serivices, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to discover services")); } err_code = sd_mutex_acquire(m_discovery_mutex); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to acquire mutex, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to acquire mutex")); } while (sd_mutex_acquire(m_discovery_mutex) == NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN) { @@ -280,8 +275,7 @@ STATIC bool discover_services(bleio_device_obj_t *device, uint16_t start_handle) err_code = sd_mutex_release(m_discovery_mutex); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to release mutex, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to release mutex")); } return m_discovery_successful; @@ -303,8 +297,7 @@ STATIC bool discover_characteristics(bleio_device_obj_t *device, bleio_service_o err_code = sd_mutex_acquire(m_discovery_mutex); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to acquire mutex, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to acquire mutex")); } while (sd_mutex_acquire(m_discovery_mutex) == NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN) { @@ -315,8 +308,7 @@ STATIC bool discover_characteristics(bleio_device_obj_t *device, bleio_service_o err_code = sd_mutex_release(m_discovery_mutex); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to release mutex, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to release mutex")); } return m_discovery_successful; @@ -324,7 +316,7 @@ STATIC bool discover_characteristics(bleio_device_obj_t *device, bleio_service_o STATIC void on_primary_srv_discovery_rsp(ble_gattc_evt_prim_srvc_disc_rsp_t *response, bleio_device_obj_t *device) { for (size_t i = 0; i < response->count; ++i) { - const ble_gattc_service_t *gattc_service = &response->services[i]; + ble_gattc_service_t *gattc_service = &response->services[i]; bleio_service_obj_t *service = m_new_obj(bleio_service_obj_t); service->base.type = &bleio_service_type; @@ -335,10 +327,7 @@ STATIC void on_primary_srv_discovery_rsp(ble_gattc_evt_prim_srvc_disc_rsp_t *res service->handle = gattc_service->handle_range.start_handle; bleio_uuid_obj_t *uuid = m_new_obj(bleio_uuid_obj_t); - uuid->base.type = &bleio_uuid_type; - uuid->type = (gattc_service->uuid.type == BLE_UUID_TYPE_BLE) ? UUID_TYPE_16BIT : UUID_TYPE_128BIT; - uuid->value[0] = gattc_service->uuid.uuid & 0xFF; - uuid->value[1] = gattc_service->uuid.uuid >> 8; + bleio_uuid_construct_from_nrf_ble_uuid(uuid, &gattc_service->uuid); service->uuid = uuid; mp_obj_list_append(device->service_list, service); @@ -350,23 +339,20 @@ STATIC void on_primary_srv_discovery_rsp(ble_gattc_evt_prim_srvc_disc_rsp_t *res const uint32_t err_code = sd_mutex_release(m_discovery_mutex); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to release mutex, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to release mutex")); } } STATIC void on_char_discovery_rsp(ble_gattc_evt_char_disc_rsp_t *response, bleio_device_obj_t *device) { for (size_t i = 0; i < response->count; ++i) { - const ble_gattc_char_t *gattc_char = &response->chars[i]; + ble_gattc_char_t *gattc_char = &response->chars[i]; bleio_characteristic_obj_t *characteristic = m_new_obj(bleio_characteristic_obj_t); characteristic->base.type = &bleio_characteristic_type; bleio_uuid_obj_t *uuid = m_new_obj(bleio_uuid_obj_t); uuid->base.type = &bleio_uuid_type; - uuid->type = (gattc_char->uuid.type == BLE_UUID_TYPE_BLE) ? UUID_TYPE_16BIT : UUID_TYPE_128BIT; - uuid->value[0] = gattc_char->uuid.uuid & 0xFF; - uuid->value[1] = gattc_char->uuid.uuid >> 8; + bleio_uuid_construct_from_nrf_ble_uuid(uuid, &gattc_char->uuid); characteristic->uuid = uuid; characteristic->props.broadcast = gattc_char->char_props.broadcast; @@ -374,7 +360,7 @@ STATIC void on_char_discovery_rsp(ble_gattc_evt_char_disc_rsp_t *response, bleio characteristic->props.notify = gattc_char->char_props.notify; characteristic->props.read = gattc_char->char_props.read; characteristic->props.write = gattc_char->char_props.write; - characteristic->props.write_wo_resp = gattc_char->char_props.write_wo_resp; + characteristic->props.write_no_response = gattc_char->char_props.write_wo_resp; characteristic->handle = gattc_char->handle_value; characteristic->service = m_char_discovery_service; @@ -387,8 +373,7 @@ STATIC void on_char_discovery_rsp(ble_gattc_evt_char_disc_rsp_t *response, bleio const uint32_t err_code = sd_mutex_release(m_discovery_mutex); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to release mutex, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to release mutex")); } } @@ -399,8 +384,7 @@ STATIC void on_adv_report(ble_gap_evt_adv_report_t *report, bleio_device_obj_t * #if (BLUETOOTH_SD == 140) err_code = sd_ble_gap_scan_start(NULL, &m_scan_buffer); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to continue scanning, status: 0x%0xlX"), err_code)); + mp_raise_OSError_msg(translate("Failed to continue scanning")); } #endif return; @@ -432,8 +416,7 @@ STATIC void on_adv_report(ble_gap_evt_adv_report_t *report, bleio_device_obj_t * #endif if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to connect, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to connect:")); } } @@ -491,14 +474,8 @@ STATIC void on_ble_evt(ble_evt_t *ble_evt, void *device_in) { } void common_hal_bleio_device_add_service(bleio_device_obj_t *device, bleio_service_obj_t *service) { - ble_uuid_t uuid = { - .type = BLE_UUID_TYPE_BLE, - .uuid = service->uuid->value[0] | (service->uuid->value[1] << 8) - }; - - if (service->uuid->type == UUID_TYPE_128BIT) { - uuid.type = service->uuid->uuid_vs_idx; - } + ble_uuid_t uuid; + bleio_uuid_convert_to_nrf_ble_uuid(service->uuid, &uuid); uint8_t service_type = BLE_GATTS_SRVC_TYPE_PRIMARY; if (service->is_secondary) { @@ -509,8 +486,7 @@ void common_hal_bleio_device_add_service(bleio_device_obj_t *device, bleio_servi const uint32_t err_code = sd_ble_gatts_service_add(service_type, &uuid, &service->handle); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to add service, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to add service")); } const mp_obj_list_t *char_list = MP_OBJ_TO_PTR(service->char_list); @@ -527,8 +503,7 @@ void common_hal_bleio_device_start_advertising(bleio_device_obj_t *device, bool const uint32_t err_code = set_advertisement_data(device, connectable, raw_data); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to start advertisment, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to start advertising")); } } @@ -545,8 +520,7 @@ void common_hal_bleio_device_stop_advertising(bleio_device_obj_t *device) { #endif if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_INVALID_STATE)) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to stop advertisment, status: 0x%08lX"), err_code)); + mp_raise_OSError_msg(translate("Failed to stop advertising")); } } @@ -571,8 +545,7 @@ void common_hal_bleio_device_connect(bleio_device_obj_t *device) { #endif if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to start scanning, status: 0x%0xlX"), err_code)); + mp_raise_OSError_msg(translate("Failed to start scanning")); } while (device->conn_handle == BLE_CONN_HANDLE_INVALID) { @@ -588,8 +561,7 @@ void common_hal_bleio_device_connect(bleio_device_obj_t *device) { err_code = sd_mutex_new(m_discovery_mutex); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to create mutex, status: 0x%0xlX"), err_code)); + mp_raise_OSError_msg(translate("Failed to create mutex")); } } diff --git a/ports/nrf/common-hal/bleio/Peripheral.c b/ports/nrf/common-hal/bleio/Peripheral.c new file mode 100644 index 0000000000..7108259607 --- /dev/null +++ b/ports/nrf/common-hal/bleio/Peripheral.c @@ -0,0 +1,338 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Artur Pacholec + * Copyright (c) 2018 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include +#include + +#include "ble.h" +#include "ble_drv.h" +#include "ble_hci.h" +#include "nrf_soc.h" +#include "py/objstr.h" +#include "py/runtime.h" +#include "shared-bindings/bleio/Adapter.h" +#include "shared-bindings/bleio/Characteristic.h" +#include "shared-bindings/bleio/Peripheral.h" +#include "shared-bindings/bleio/Service.h" +#include "shared-bindings/bleio/UUID.h" + +#define BLE_MIN_CONN_INTERVAL MSEC_TO_UNITS(15, UNIT_0_625_MS) +#define BLE_MAX_CONN_INTERVAL MSEC_TO_UNITS(300, UNIT_0_625_MS) +#define BLE_SLAVE_LATENCY 0 +#define BLE_CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) + +#define BLE_ADV_LENGTH_FIELD_SIZE 1 +#define BLE_ADV_AD_TYPE_FIELD_SIZE 1 +#define BLE_AD_TYPE_FLAGS_DATA_SIZE 1 + +static uint8_t m_adv_handle = BLE_GAP_ADV_SET_HANDLE_NOT_SET; + +STATIC void check_data_fit(size_t pos, size_t data_len) { + if (pos + data_len >= BLE_GAP_ADV_SET_DATA_SIZE_MAX) { + mp_raise_ValueError(translate("Data too large for advertisement packet")); + } +} + +STATIC uint32_t add_services_to_advertisement(bleio_peripheral_obj_t *self, size_t* adv_data_pos_p, size_t uuid_len) { + uint32_t uuids_total_size = 0; + const mp_obj_list_t *service_list = MP_OBJ_TO_PTR(self->service_list); + uint32_t err_code = NRF_SUCCESS; + + check_data_fit(*adv_data_pos_p, 1 + 1); + + // Remember where length byte is; fill in later when we know the size. + const size_t length_pos = *adv_data_pos_p; + (*adv_data_pos_p)++; + + self->adv_data[(*adv_data_pos_p)++] = (uuid_len == 16) + ? BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE + : BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE; + + for (size_t i = 0; i < service_list->len; ++i) { + const bleio_service_obj_t *service = MP_OBJ_TO_PTR(service_list->items[i]); + uint8_t encoded_size = 0; + + // Skip services of the wrong length and secondary services. + if (common_hal_bleio_uuid_get_size(service->uuid) != uuid_len || service->is_secondary) { + continue; + } + + ble_uuid_t uuid; + bleio_uuid_convert_to_nrf_ble_uuid(service->uuid, &uuid); + + err_code = sd_ble_uuid_encode(&uuid, &encoded_size, &(self->adv_data[*adv_data_pos_p])); + if (err_code != NRF_SUCCESS) { + return err_code; + } + + check_data_fit(*adv_data_pos_p, encoded_size); + uuids_total_size += encoded_size; + (*adv_data_pos_p) += encoded_size; + } + + self->adv_data[length_pos] = 1 + uuids_total_size; // 1 for the field type. + return err_code; +} + + + +// if raw_data is a zero-length buffer, generate an advertising packet that advertises the +// services passed in when this Peripheral was created. +// If raw_data contains some bytes, use those bytes as the advertising packet. +// TODO: Generate the advertising packet in Python, not here. +STATIC uint32_t set_advertisement_data(bleio_peripheral_obj_t *self, bool connectable, mp_buffer_info_t *raw_data) { + common_hal_bleio_adapter_set_enabled(true); + + size_t adv_data_pos = 0; + uint32_t err_code; + + GET_STR_DATA_LEN(self->name, name_data, name_len); + if (name_len > 0) { + ble_gap_conn_sec_mode_t sec_mode; + BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode); + + // We'll add the name after everything else, shortening it if necessary. + err_code = sd_ble_gap_device_name_set(&sec_mode, name_data, name_len); + if (err_code != NRF_SUCCESS) { + return err_code; + } + } + + if (raw_data->len != 0) { + // User-supplied advertising packet. + check_data_fit(adv_data_pos, raw_data->len); + memcpy(&(self->adv_data[adv_data_pos]), raw_data->buf, raw_data->len); + adv_data_pos += raw_data->len; + } else { + // Build up advertising packet. + check_data_fit(adv_data_pos, 1 + 1 + 1); + self->adv_data[adv_data_pos++] = 2; + self->adv_data[adv_data_pos++] = BLE_GAP_AD_TYPE_FLAGS; + self->adv_data[adv_data_pos++] = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; + + // The 16-bit ids and 128-bit ids are grouped together by length, so find it whether we have + // 16 and/or 128-bit service UUIDs. + + const mp_obj_list_t *service_list = MP_OBJ_TO_PTR(self->service_list); + if (service_list->len > 0) { + bool has_128bit_services = false; + bool has_16bit_services = false; + + for (size_t i = 0; i < service_list->len; ++i) { + const bleio_service_obj_t *service = MP_OBJ_TO_PTR(service_list->items[i]); + + if (service->is_secondary) { + continue; + } + + switch (common_hal_bleio_uuid_get_size(service->uuid)) { + case 16: + has_16bit_services = true; + break; + case 128: + has_128bit_services = true; + break; + } + } + + // Add 16-bit service UUID's in a group, then 128-bit service UUID's. + + if (has_16bit_services) { + err_code = add_services_to_advertisement(self, &adv_data_pos, 16); + if (err_code != NRF_SUCCESS) { + return err_code; + } + } + + if (has_128bit_services) { + err_code = add_services_to_advertisement(self, &adv_data_pos, 128); + if (err_code != NRF_SUCCESS) { + return err_code; + } + } + } + + // Always include TX power. + check_data_fit(adv_data_pos, 1 + 1 + 1); + self->adv_data[adv_data_pos++] = 1 + 1; + self->adv_data[adv_data_pos++] = BLE_GAP_AD_TYPE_TX_POWER_LEVEL; + self->adv_data[adv_data_pos++] = 0; // TODO - allow power level to be set later. + + // We need room for at least a one-character name. + check_data_fit(adv_data_pos, 1 + 1 + 1); + + // How big a name can we fit? + size_t bytes_left = BLE_GAP_ADV_SET_DATA_SIZE_MAX - adv_data_pos - 1 - 1; + size_t partial_name_len = MIN(bytes_left, name_len); + self->adv_data[adv_data_pos++] = 1 + partial_name_len; + self->adv_data[adv_data_pos++] = (partial_name_len == name_len) + ? BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME + : BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME; + memcpy(&(self->adv_data[adv_data_pos]), name_data, partial_name_len); + adv_data_pos += partial_name_len; + } // end of advertising packet construction + + static ble_gap_adv_params_t m_adv_params = { + .interval = MSEC_TO_UNITS(1000, UNIT_0_625_MS), + .properties.type = BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED, + .duration = BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED, + .filter_policy = BLE_GAP_ADV_FP_ANY, + .primary_phy = BLE_GAP_PHY_1MBPS, + }; + + if (!connectable) { + m_adv_params.properties.type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED; + } + + common_hal_bleio_peripheral_stop_advertising(self); + + const ble_gap_adv_data_t ble_gap_adv_data = { + .adv_data.p_data = self->adv_data, + .adv_data.len = adv_data_pos, + }; + + err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &ble_gap_adv_data, &m_adv_params); + if (err_code != NRF_SUCCESS) { + return err_code; + } + + err_code = sd_ble_gap_adv_start(m_adv_handle, BLE_CONN_CFG_TAG_CUSTOM); + + return err_code; +} + +STATIC void peripheral_on_ble_evt(ble_evt_t *ble_evt, void *self_in) { + bleio_peripheral_obj_t *self = (bleio_peripheral_obj_t*)self_in; + + switch (ble_evt->header.evt_id) { + case BLE_GAP_EVT_CONNECTED: { + // Central has connected. + ble_gap_conn_params_t conn_params; + self->conn_handle = ble_evt->evt.gap_evt.conn_handle; + sd_ble_gap_ppcp_get(&conn_params); + sd_ble_gap_conn_param_update(ble_evt->evt.gap_evt.conn_handle, &conn_params); + break; + } + + case BLE_GAP_EVT_DISCONNECTED: + // Central has disconnected. + self->conn_handle = BLE_CONN_HANDLE_INVALID; + break; + + case BLE_GAP_EVT_PHY_UPDATE_REQUEST: { + ble_gap_phys_t const phys = { + .rx_phys = BLE_GAP_PHY_AUTO, + .tx_phys = BLE_GAP_PHY_AUTO, + }; + sd_ble_gap_phy_update(ble_evt->evt.gap_evt.conn_handle, &phys); + break; + } + + case BLE_GAP_EVT_ADV_SET_TERMINATED: + // Someday may handle timeouts or limit reached. + break; + + case BLE_GAP_EVT_SEC_PARAMS_REQUEST: + sd_ble_gap_sec_params_reply(self->conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL); + break; + + case BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST: { + ble_gap_evt_conn_param_update_request_t *request = &ble_evt->evt.gap_evt.params.conn_param_update_request; + sd_ble_gap_conn_param_update(self->conn_handle, &request->conn_params); + break; + } + + case BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST: { + sd_ble_gatts_exchange_mtu_reply(self->conn_handle, BLE_GATT_ATT_MTU_DEFAULT); + break; + } + + default: + // For debugging. + // mp_printf(&mp_plat_print, "Unhandled peripheral event: 0x%04x\n", ble_evt->header.evt_id); + break; + } +} + + +void common_hal_bleio_peripheral_construct(bleio_peripheral_obj_t *self) { + common_hal_bleio_adapter_set_enabled(true); // TODO -- Do this somewhere else maybe bleio __init__ + + self->gatt_role = GATT_ROLE_SERVER; + self->conn_handle = BLE_CONN_HANDLE_INVALID; + + // Add all the services. + + mp_obj_list_t *service_list = MP_OBJ_TO_PTR(self->service_list); + for (size_t service_idx = 0; service_idx < service_list->len; ++service_idx) { + bleio_service_obj_t *service = MP_OBJ_TO_PTR(service_list->items[service_idx]); + + ble_uuid_t uuid; + bleio_uuid_convert_to_nrf_ble_uuid(service->uuid, &uuid); + + uint8_t service_type = BLE_GATTS_SRVC_TYPE_PRIMARY; + if (service->is_secondary) { + service_type = BLE_GATTS_SRVC_TYPE_SECONDARY; + } + + const uint32_t err_code = sd_ble_gatts_service_add(service_type, &uuid, &service->handle); + if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Failed to add service, err 0x%04x"), err_code); + } + + // Once the service has been registered, its characteristics can be added. + common_hal_bleio_service_add_all_characteristics(service); + } +} + + +bool common_hal_bleio_peripheral_get_connected(bleio_peripheral_obj_t *self) { + return self->conn_handle != BLE_CONN_HANDLE_INVALID; +} + +void common_hal_bleio_peripheral_start_advertising(bleio_peripheral_obj_t *self, bool connectable, mp_buffer_info_t *raw_data) { + if (connectable) { + ble_drv_add_event_handler(peripheral_on_ble_evt, self); + } + + const uint32_t err_code = set_advertisement_data(self, connectable, raw_data); + if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Failed to start advertising, err 0x%04x"), err_code); + } +} + +void common_hal_bleio_peripheral_stop_advertising(bleio_peripheral_obj_t *self) { + + if (m_adv_handle == BLE_GAP_ADV_SET_HANDLE_NOT_SET) + return; + + const uint32_t err_code = sd_ble_gap_adv_stop(m_adv_handle); + + if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_INVALID_STATE)) { + mp_raise_OSError_msg_varg(translate("Failed to stop advertising, err 0x%04x"), err_code); + } +} diff --git a/ports/nrf/common-hal/bleio/Peripheral.h b/ports/nrf/common-hal/bleio/Peripheral.h new file mode 100644 index 0000000000..b255fe9f40 --- /dev/null +++ b/ports/nrf/common-hal/bleio/Peripheral.h @@ -0,0 +1,53 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Artur Pacholec + * Copyright (c) 2018 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_COMMON_HAL_BLEIO_PERIPHERAL_H +#define MICROPY_INCLUDED_COMMON_HAL_BLEIO_PERIPHERAL_H + +#include + +#include "ble.h" + +#include "shared-module/bleio/__init__.h" +#include "shared-module/bleio/Address.h" + +typedef struct { + mp_obj_base_t base; + mp_obj_t name; + gatt_role_t gatt_role; + volatile uint16_t conn_handle; + mp_obj_t service_list; + mp_obj_t notif_handler; + mp_obj_t conn_handler; + // The advertising data buffer is held by us, not by the SD, so we must + // maintain it and not change it. If we need to change its contents during advertising, + // there are tricks to get the SD to notice (see DevZone - TBS). + uint8_t adv_data[BLE_GAP_ADV_SET_DATA_SIZE_MAX]; + +} bleio_peripheral_obj_t; + +#endif // MICROPY_INCLUDED_COMMON_HAL_BLEIO_PERIPHERAL_H diff --git a/ports/nrf/common-hal/bleio/Scanner.c b/ports/nrf/common-hal/bleio/Scanner.c index e56c1860c2..d2e19b5f9f 100644 --- a/ports/nrf/common-hal/bleio/Scanner.c +++ b/ports/nrf/common-hal/bleio/Scanner.c @@ -30,7 +30,7 @@ #include "ble_drv.h" #include "ble_gap.h" #include "py/mphal.h" -#include "py/nlr.h" +#include "py/runtime.h" #include "shared-bindings/bleio/Adapter.h" #include "shared-bindings/bleio/ScanEntry.h" #include "shared-bindings/bleio/Scanner.h" @@ -72,8 +72,7 @@ STATIC void on_ble_evt(ble_evt_t *ble_evt, void *scanner_in) { #if (BLUETOOTH_SD == 140) const uint32_t err_code = sd_ble_gap_scan_start(NULL, &m_scan_buffer); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to continue scanning, status: 0x%0xlX"), err_code)); + mp_raise_OSError_msg_varg(translate("Failed to continue scanning, err 0x%04x"), err_code); } #endif } @@ -99,8 +98,7 @@ void common_hal_bleio_scanner_scan(bleio_scanner_obj_t *self, mp_int_t timeout) #endif if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to start scanning, status: 0x%0xlX"), err_code)); + mp_raise_OSError_msg_varg(translate("Failed to start scanning, err 0x%04x"), err_code); } if (timeout > 0) { diff --git a/ports/nrf/common-hal/bleio/Service.c b/ports/nrf/common-hal/bleio/Service.c index c17c169047..26a1f1cff5 100644 --- a/ports/nrf/common-hal/bleio/Service.c +++ b/ports/nrf/common-hal/bleio/Service.c @@ -26,65 +26,75 @@ #include "ble_drv.h" #include "ble.h" -#include "py/nlr.h" +#include "py/runtime.h" +#include "common-hal/bleio/__init__.h" +#include "common-hal/bleio/Characteristic.h" #include "shared-bindings/bleio/Service.h" #include "shared-bindings/bleio/Adapter.h" -void common_hal_bleio_service_add_characteristic(bleio_service_obj_t *self, bleio_characteristic_obj_t *characteristic) { - ble_gatts_char_md_t char_md = { - .char_props.broadcast = characteristic->props.broadcast, - .char_props.read = characteristic->props.read, - .char_props.write_wo_resp = characteristic->props.write_wo_resp, - .char_props.write = characteristic->props.write, - .char_props.notify = characteristic->props.notify, - .char_props.indicate = characteristic->props.indicate, - }; - - ble_gatts_attr_md_t cccd_md = { - .vloc = BLE_GATTS_VLOC_STACK, - }; - - if (char_md.char_props.notify || char_md.char_props.indicate) { - BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.read_perm); - BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.write_perm); - - char_md.p_cccd_md = &cccd_md; - } - - ble_uuid_t uuid = { - .type = BLE_UUID_TYPE_BLE, - .uuid = characteristic->uuid->value[0] | (characteristic->uuid->value[1] << 8), - }; - - if (characteristic->uuid->type == UUID_TYPE_128BIT) - uuid.type = characteristic->uuid->uuid_vs_idx; - - ble_gatts_attr_md_t attr_md = { - .vloc = BLE_GATTS_VLOC_STACK, - .vlen = 1, - }; - - BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.read_perm); - BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.write_perm); - - ble_gatts_attr_t attr_char_value = { - .p_uuid = &uuid, - .p_attr_md = &attr_md, - .init_len = sizeof(uint8_t), - .max_len = (BLE_GATT_ATT_MTU_DEFAULT - 3), - }; - - ble_gatts_char_handles_t handles; - - uint32_t err_code; - err_code = sd_ble_gatts_characteristic_add(self->handle, &char_md, &attr_char_value, &handles); - if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to add characteristic, status: 0x%08lX"), err_code)); - } - - characteristic->user_desc_handle = handles.user_desc_handle; - characteristic->cccd_handle = handles.cccd_handle; - characteristic->sccd_handle = handles.sccd_handle; - characteristic->handle = handles.value_handle; +void common_hal_bleio_service_construct(bleio_service_obj_t *self) { +} + +// Call this after the Service has been added to the Peripheral. +void common_hal_bleio_service_add_all_characteristics(bleio_service_obj_t *self) { + // Add all the characteristics. + const mp_obj_list_t *char_list = MP_OBJ_TO_PTR(self->char_list); + for (size_t char_idx = 0; char_idx < char_list->len; ++char_idx) { + bleio_characteristic_obj_t *characteristic = char_list->items[char_idx]; + + ble_gatts_char_md_t char_md = { + .char_props.broadcast = characteristic->props.broadcast, + .char_props.read = characteristic->props.read, + .char_props.write_wo_resp = characteristic->props.write_no_response, + .char_props.write = characteristic->props.write, + .char_props.notify = characteristic->props.notify, + .char_props.indicate = characteristic->props.indicate, + }; + + ble_gatts_attr_md_t cccd_md = { + .vloc = BLE_GATTS_VLOC_STACK, + }; + + if (char_md.char_props.notify || char_md.char_props.indicate) { + BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.read_perm); + BLE_GAP_CONN_SEC_MODE_SET_OPEN(&cccd_md.write_perm); + + char_md.p_cccd_md = &cccd_md; + } + + ble_uuid_t uuid; + bleio_uuid_convert_to_nrf_ble_uuid(characteristic->uuid, &uuid); + + ble_gatts_attr_md_t attr_md = { + .vloc = BLE_GATTS_VLOC_STACK, + .vlen = 1, + }; + + BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.read_perm); + BLE_GAP_CONN_SEC_MODE_SET_OPEN(&attr_md.write_perm); + + ble_gatts_attr_t attr_char_value = { + .p_uuid = &uuid, + .p_attr_md = &attr_md, + .init_len = sizeof(uint8_t), + .max_len = GATT_MAX_DATA_LENGTH, + }; + + ble_gatts_char_handles_t handles; + + uint32_t err_code; + err_code = sd_ble_gatts_characteristic_add(self->handle, &char_md, &attr_char_value, &handles); + if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Failed to add characteristic, err 0x%04x"), err_code); + } + + if (characteristic->handle != BLE_GATT_HANDLE_INVALID) { + mp_raise_ValueError(translate("Characteristic already in use by another Service.")); + } + + characteristic->user_desc_handle = handles.user_desc_handle; + characteristic->cccd_handle = handles.cccd_handle; + characteristic->sccd_handle = handles.sccd_handle; + characteristic->handle = handles.value_handle; + } } diff --git a/ports/nrf/common-hal/bleio/UUID.c b/ports/nrf/common-hal/bleio/UUID.c index 9a2e101ea5..23e643433f 100644 --- a/ports/nrf/common-hal/bleio/UUID.c +++ b/ports/nrf/common-hal/bleio/UUID.c @@ -25,100 +25,74 @@ * THE SOFTWARE. */ +#include + +#include "py/runtime.h" +#include "common-hal/bleio/UUID.h" +#include "shared-bindings/bleio/Adapter.h" + #include "ble.h" #include "ble_drv.h" -#include "common-hal/bleio/UUID.h" #include "nrf_error.h" -#include "py/objstr.h" -#include "py/runtime.h" -#include "shared-bindings/bleio/Adapter.h" -#include "shared-bindings/bleio/UUID.h" -#define UUID_STR_16BIT_LEN 6 -#define UUID_STR_128BIT_LEN 36 +// If uuid128 is NULL, this is a Bluetooth SIG 16-bit UUID. +// If uuid128 is not NULL, it's a 128-bit (16-byte) UUID, with bytes 12 and 13 zero'd out, where +// the 16-bit part goes. Those 16 bits are passed in uuid16. +void common_hal_bleio_uuid_construct(bleio_uuid_obj_t *self, uint32_t uuid16, uint8_t uuid128[]) { + common_hal_bleio_adapter_set_enabled(true); -static uint8_t xdigit_8b_value(byte nibble1, byte nibble2) { - return unichar_xdigit_value(nibble1) | - (unichar_xdigit_value(nibble2) << 4); -} - -void common_hal_bleio_uuid_construct(bleio_uuid_obj_t *self, const mp_obj_t *uuid) { - if (MP_OBJ_IS_INT(*uuid)) { - self->type = UUID_TYPE_16BIT; - - self->value[1] = (mp_obj_get_int(*uuid) >> 8) & 0xFF; - self->value[0] = (mp_obj_get_int(*uuid) >> 0) & 0xFF; - return; - } - - if (MP_OBJ_IS_STR(*uuid)) { - GET_STR_DATA_LEN(*uuid, str_data, str_len); - - if (str_len == UUID_STR_16BIT_LEN) { - self->type = UUID_TYPE_16BIT; - - self->value[0] = xdigit_8b_value(str_data[5], str_data[4]); - self->value[1] = xdigit_8b_value(str_data[3], str_data[2]); - } else if (str_len == UUID_STR_128BIT_LEN) { - self->type = UUID_TYPE_128BIT; - - ble_uuid128_t vs_uuid; - vs_uuid.uuid128[0] = xdigit_8b_value(str_data[35], str_data[34]); - vs_uuid.uuid128[1] = xdigit_8b_value(str_data[33], str_data[32]); - vs_uuid.uuid128[2] = xdigit_8b_value(str_data[31], str_data[30]); - vs_uuid.uuid128[3] = xdigit_8b_value(str_data[29], str_data[28]); - vs_uuid.uuid128[4] = xdigit_8b_value(str_data[27], str_data[26]); - vs_uuid.uuid128[5] = xdigit_8b_value(str_data[25], str_data[24]); - - // 23 '-' - vs_uuid.uuid128[6] = xdigit_8b_value(str_data[22], str_data[21]); - vs_uuid.uuid128[7] = xdigit_8b_value(str_data[20], str_data[19]); - - // 18 '-' - vs_uuid.uuid128[8] = xdigit_8b_value(str_data[17], str_data[16]); - vs_uuid.uuid128[9] = xdigit_8b_value(str_data[15], str_data[14]); - - // 13 '-' - vs_uuid.uuid128[10] = xdigit_8b_value(str_data[12], str_data[11]); - vs_uuid.uuid128[11] = xdigit_8b_value(str_data[10], str_data[9]); - - // 8 '-' - self->value[0] = xdigit_8b_value(str_data[7], str_data[6]); - self->value[1] = xdigit_8b_value(str_data[5], str_data[4]); - - vs_uuid.uuid128[14] = xdigit_8b_value(str_data[3], str_data[2]); - vs_uuid.uuid128[15] = xdigit_8b_value(str_data[1], str_data[0]); - - common_hal_bleio_adapter_set_enabled(true); - - const uint32_t err_code = sd_ble_uuid_vs_add(&vs_uuid, &self->uuid_vs_idx); - if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Failed to add Vendor Specific UUID, status: 0x%08lX"), err_code)); - } - - } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, - translate("Invalid UUID string length"))); - } - - return; - } - - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, - translate("Invalid UUID parameter"))); -} - -void common_hal_bleio_uuid_print(bleio_uuid_obj_t *self, const mp_print_t *print) { - if (self->type == UUID_TYPE_16BIT) { - mp_printf(print, "UUID(uuid: 0x" HEX2_FMT HEX2_FMT ")", - self->value[1], self->value[0]); + self->nrf_ble_uuid.uuid = uuid16; + if (uuid128 == NULL) { + self->nrf_ble_uuid.type = BLE_UUID_TYPE_BLE; } else { - mp_printf(print, "UUID(uuid: 0x" HEX2_FMT HEX2_FMT ", VS idx: " HEX2_FMT ")", - self->value[1], self->value[0], self->uuid_vs_idx); + ble_uuid128_t vs_uuid; + memcpy(vs_uuid.uuid128, uuid128, sizeof(vs_uuid.uuid128)); + + // Register this vendor-specific UUID. Bytes 12 and 13 will be zero. + const uint32_t err_code = sd_ble_uuid_vs_add(&vs_uuid, &self->nrf_ble_uuid.type); + if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Failed to register Vendor-Specific UUID, err 0x%04x"), err_code); + } } } -bleio_uuid_type_t common_hal_bleio_uuid_get_type(bleio_uuid_obj_t *self) { - return self->type; +uint32_t common_hal_bleio_uuid_get_size(bleio_uuid_obj_t *self) { + return self->nrf_ble_uuid.type == BLE_UUID_TYPE_BLE ? 16 : 128; +} + +uint32_t common_hal_bleio_uuid_get_uuid16(bleio_uuid_obj_t *self) { + return self->nrf_ble_uuid.uuid; +} + +// True if uuid128 has been successfully filled in. +bool common_hal_bleio_uuid_get_uuid128(bleio_uuid_obj_t *self, uint8_t uuid128[16]) { + uint8_t length; + const uint32_t err_code = sd_ble_uuid_encode(&self->nrf_ble_uuid, &length, uuid128); + + if (err_code != NRF_SUCCESS) { + mp_raise_OSError_msg_varg(translate("Could not decode ble_uuid, err 0x%04x"), err_code); + } + // If not 16 bytes, this is not a 128-bit UUID, so return. + return length == 16; +} + +// Returns 0 if this is a 16-bit UUID, otherwise returns a non-zero index +// into the 128-bit uuid registration table. +uint32_t common_hal_bleio_uuid_get_uuid128_reference(bleio_uuid_obj_t *self) { + return self->nrf_ble_uuid.type == BLE_UUID_TYPE_BLE ? 0 : self->nrf_ble_uuid.type; +} + + +void bleio_uuid_construct_from_nrf_ble_uuid(bleio_uuid_obj_t *self, ble_uuid_t *nrf_ble_uuid) { + if (nrf_ble_uuid->type == BLE_UUID_TYPE_UNKNOWN) { + mp_raise_RuntimeError(translate("Unexpected nrfx uuid type")); + } + self->nrf_ble_uuid.uuid = nrf_ble_uuid->uuid; + self->nrf_ble_uuid.type = nrf_ble_uuid->type; +} + +// Fill in a ble_uuid_t from my values. +void bleio_uuid_convert_to_nrf_ble_uuid(bleio_uuid_obj_t *self, ble_uuid_t *nrf_ble_uuid) { + nrf_ble_uuid->uuid = self->nrf_ble_uuid.uuid; + nrf_ble_uuid->type = self->nrf_ble_uuid.type; } diff --git a/ports/nrf/common-hal/bleio/UUID.h b/ports/nrf/common-hal/bleio/UUID.h index cb0fddcfd7..b464093ea1 100644 --- a/ports/nrf/common-hal/bleio/UUID.h +++ b/ports/nrf/common-hal/bleio/UUID.h @@ -28,13 +28,21 @@ #ifndef MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_UUID_H #define MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_UUID_H -#include "shared-bindings/bleio/UUIDType.h" +#include "py/obj.h" + +#include "ble.h" typedef struct { mp_obj_base_t base; - bleio_uuid_type_t type; - uint8_t uuid_vs_idx; - uint8_t value[2]; + // Use the native way of storing UUID's: + // - ble_uuid_t.uuid is a 16-bit uuid. + // - ble_uuid_t.type is BLE_UUID_TYPE_BLE if it's a 16-bit Bluetooth SIG UUID. + // or is BLE_UUID_TYPE_VENDOR_BEGIN and higher, which indexes into a table of registered + // 128-bit UUIDs. + ble_uuid_t nrf_ble_uuid; } bleio_uuid_obj_t; +void bleio_uuid_construct_from_nrf_ble_uuid(bleio_uuid_obj_t *self, ble_uuid_t *nrf_uuid); +void bleio_uuid_convert_to_nrf_ble_uuid(bleio_uuid_obj_t *self, ble_uuid_t *nrf_uuid); + #endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BLEIO_UUID_H diff --git a/ports/nrf/common-hal/bleio/__init__.c b/ports/nrf/common-hal/bleio/__init__.c index 0cc1b71522..cfb701019d 100644 --- a/ports/nrf/common-hal/bleio/__init__.c +++ b/ports/nrf/common-hal/bleio/__init__.c @@ -27,6 +27,15 @@ #include "shared-bindings/bleio/__init__.h" #include "shared-bindings/bleio/Adapter.h" +#include "shared-bindings/bleio/Peripheral.h" +#include "common-hal/bleio/__init__.h" + +// Turn off BLE on a reset or reload. +void bleio_reset() { + if (common_hal_bleio_adapter_get_enabled()) { + common_hal_bleio_adapter_set_enabled(false); + } +} // The singleton bleio.Adapter object, bound to bleio.adapter // It currently only has properties and no state @@ -35,3 +44,25 @@ const super_adapter_obj_t common_hal_bleio_adapter_obj = { .type = &bleio_adapter_type, }, }; + +gatt_role_t common_hal_bleio_device_get_gatt_role(mp_obj_t device) { + if (MP_OBJ_IS_TYPE(device, &bleio_peripheral_type)) { + return ((bleio_peripheral_obj_t*) MP_OBJ_TO_PTR(device))->gatt_role; +// Does not exist yet. +// } else if (MP_OBJ_IS_TYPE(device, &bleio_central_type)) { +// return ((bleio_central_obj_t*) MP_OBJ_TO_PTR(device))->gatt_role; + } else { + return GATT_ROLE_NONE; + } +} + +uint16_t common_hal_bleio_device_get_conn_handle(mp_obj_t device) { + if (MP_OBJ_IS_TYPE(device, &bleio_peripheral_type)) { + return ((bleio_peripheral_obj_t*) MP_OBJ_TO_PTR(device))->conn_handle; +// Does not exist yet. +// } else if (MP_OBJ_IS_TYPE(device, &bleio_central_type)) { +// return ((bleio_central_obj_t*) MP_OBJ_TO_PTR(device))->conn_handle; + } else { + return 0; + } +} diff --git a/ports/nrf/boards/pca10040/mpconfigboard.h b/ports/nrf/common-hal/bleio/__init__.h similarity index 69% rename from ports/nrf/boards/pca10040/mpconfigboard.h rename to ports/nrf/common-hal/bleio/__init__.h index 3961028325..9e044f37c1 100644 --- a/ports/nrf/boards/pca10040/mpconfigboard.h +++ b/ports/nrf/common-hal/bleio/__init__.h @@ -3,7 +3,6 @@ * * The MIT License (MIT) * - * Copyright (c) 2016 Glenn Ruben Bakke * Copyright (c) 2018 Dan Halbert for Adafruit Industries * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -25,15 +24,19 @@ * THE SOFTWARE. */ -#define MICROPY_HW_BOARD_NAME "PCA10040" -#define MICROPY_HW_MCU_NAME "nRF52832" -#define MICROPY_PY_SYS_PLATFORM "nRF52-DK" +#ifndef MICROPY_INCLUDED_COMMON_HAL_BLEIO_INIT_H +#define MICROPY_INCLUDED_COMMON_HAL_BLEIO_INIT_H -#define MICROPY_HW_LED_STATUS (&pin_P0_17) +#include "shared-bindings/bleio/__init__.h" +#include "shared-bindings/bleio/Adapter.h" -#define MICROPY_HW_UART_RX NRF_GPIO_PIN_MAP(0, 8) -#define MICROPY_HW_UART_TX NRF_GPIO_PIN_MAP(0, 6) -#define MICROPY_HW_UART_HWFC (0) +#include "shared-module/bleio/__init__.h" -#define PORT_HEAP_SIZE (32 * 1024) -#define CIRCUITPY_AUTORELOAD_DELAY_MS 500 +// We assume variable length data. +// 20 bytes max (23 - 3). +#define GATT_MAX_DATA_LENGTH (BLE_GATT_ATT_MTU_DEFAULT - 3) + +gatt_role_t common_hal_bleio_device_get_gatt_role(mp_obj_t device); +uint16_t common_hal_bleio_device_get_conn_handle(mp_obj_t device); + +#endif // MICROPY_INCLUDED_COMMON_HAL_BLEIO_INIT_H diff --git a/ports/nrf/common-hal/board/__init__.c b/ports/nrf/common-hal/board/__init__.c index 350f2eea5e..880033ed67 100644 --- a/ports/nrf/common-hal/board/__init__.c +++ b/ports/nrf/common-hal/board/__init__.c @@ -23,6 +23,3 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ - -// Pins aren't actually defined here. They are in the board specific directory -// such as boards/feather_nrf52832/pins.csv diff --git a/ports/nrf/common-hal/microcontroller/Processor.c b/ports/nrf/common-hal/microcontroller/Processor.c index e4d9439c99..836020d159 100644 --- a/ports/nrf/common-hal/microcontroller/Processor.c +++ b/ports/nrf/common-hal/microcontroller/Processor.c @@ -45,10 +45,7 @@ float common_hal_mcu_processor_get_temperature(void) { if (sd_en) { uint32_t err_code = sd_temp_get(&temp); if (err_code != NRF_SUCCESS) { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_OSError, - translate("Can not get temperature. status: 0x%02x"), (uint16_t)err_code)); - - return 0; + mp_raise_OSError_msg(translate("Cannot get temperature")); } } #endif diff --git a/ports/nrf/common-hal/neopixel_write/__init__.c b/ports/nrf/common-hal/neopixel_write/__init__.c index f810a44cc3..f47188ea2f 100644 --- a/ports/nrf/common-hal/neopixel_write/__init__.c +++ b/ports/nrf/common-hal/neopixel_write/__init__.c @@ -65,7 +65,7 @@ // // If there is no device available an alternative cycle-counter // implementation is tried. -// The nRF52832 runs with a fixed clock of 64Mhz. The alternative +// The nRF52840 runs with a fixed clock of 64Mhz. The alternative // implementation is the same as the one used for the Teensy 3.0/1/2 but // with the Nordic SDK HAL & registers syntax. // The number of cycles was hand picked and is guaranteed to be 100% diff --git a/ports/nrf/peripherals/nrf/nrf52832/pins.c b/ports/nrf/peripherals/nrf/nrf52832/pins.c deleted file mode 100644 index fdfa766ec8..0000000000 --- a/ports/nrf/peripherals/nrf/nrf52832/pins.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018 Dan Halbert for Adafruit Industries - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -// DO NOT include this file directly. Use shared-bindings/microcontroller/Pin.h instead to ensure -// that all necessary includes are already included. - -#include "py/obj.h" -#include "py/mphal.h" -#include "nrf/pins.h" - -const mcu_pin_obj_t pin_P0_00 = PIN(P0_00, 0, 0, 0); -const mcu_pin_obj_t pin_P0_01 = PIN(P0_01, 0, 1, 0); -const mcu_pin_obj_t pin_P0_02 = PIN(P0_02, 0, 2, SAADC_CH_PSELP_PSELP_AnalogInput0); -const mcu_pin_obj_t pin_P0_03 = PIN(P0_03, 0, 3, SAADC_CH_PSELP_PSELP_AnalogInput1); -const mcu_pin_obj_t pin_P0_04 = PIN(P0_04, 0, 4, SAADC_CH_PSELP_PSELP_AnalogInput2); -const mcu_pin_obj_t pin_P0_05 = PIN(P0_05, 0, 5, SAADC_CH_PSELP_PSELP_AnalogInput3); -const mcu_pin_obj_t pin_P0_06 = PIN(P0_06, 0, 6, 0); -const mcu_pin_obj_t pin_P0_07 = PIN(P0_07, 0, 7, 0); -const mcu_pin_obj_t pin_P0_08 = PIN(P0_08, 0, 8, 0); -const mcu_pin_obj_t pin_P0_09 = PIN(P0_09, 0, 9, 0); -const mcu_pin_obj_t pin_P0_10 = PIN(P0_10, 0, 10, 0); -const mcu_pin_obj_t pin_P0_11 = PIN(P0_11, 0, 11, 0); -const mcu_pin_obj_t pin_P0_12 = PIN(P0_12, 0, 12, 0); -const mcu_pin_obj_t pin_P0_13 = PIN(P0_13, 0, 13, 0); -const mcu_pin_obj_t pin_P0_14 = PIN(P0_14, 0, 14, 0); -const mcu_pin_obj_t pin_P0_15 = PIN(P0_15, 0, 15, 0); -const mcu_pin_obj_t pin_P0_16 = PIN(P0_16, 0, 16, 0); -const mcu_pin_obj_t pin_P0_17 = PIN(P0_17, 0, 17, 0); -const mcu_pin_obj_t pin_P0_18 = PIN(P0_18, 0, 18, 0); -const mcu_pin_obj_t pin_P0_19 = PIN(P0_19, 0, 19, 0); -const mcu_pin_obj_t pin_P0_20 = PIN(P0_20, 0, 20, 0); -const mcu_pin_obj_t pin_P0_21 = PIN(P0_21, 0, 21, 0); -const mcu_pin_obj_t pin_P0_22 = PIN(P0_22, 0, 22, 0); -const mcu_pin_obj_t pin_P0_23 = PIN(P0_23, 0, 23, 0); -const mcu_pin_obj_t pin_P0_24 = PIN(P0_24, 0, 24, 0); -const mcu_pin_obj_t pin_P0_25 = PIN(P0_25, 0, 25, 0); -const mcu_pin_obj_t pin_P0_26 = PIN(P0_26, 0, 26, 0); -const mcu_pin_obj_t pin_P0_27 = PIN(P0_27, 0, 27, 0); -const mcu_pin_obj_t pin_P0_28 = PIN(P0_28, 0, 28, SAADC_CH_PSELP_PSELP_AnalogInput4); -const mcu_pin_obj_t pin_P0_29 = PIN(P0_29, 0, 29, SAADC_CH_PSELP_PSELP_AnalogInput5); -const mcu_pin_obj_t pin_P0_30 = PIN(P0_30, 0, 30, SAADC_CH_PSELP_PSELP_AnalogInput6); -const mcu_pin_obj_t pin_P0_31 = PIN(P0_31, 0, 31, SAADC_CH_PSELP_PSELP_AnalogInput7); diff --git a/ports/nrf/peripherals/nrf/nrf52832/pins.h b/ports/nrf/peripherals/nrf/nrf52832/pins.h deleted file mode 100644 index f8ef85ad09..0000000000 --- a/ports/nrf/peripherals/nrf/nrf52832/pins.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018 by Dan Halbert for Adafruit Industries - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#ifndef MICROPY_INCLUDED_NRF_PERIPHERALS_NRF52832_PINS_H -#define MICROPY_INCLUDED_NRF_PERIPHERALS_NRF52832_PINS_H - -extern const mcu_pin_obj_t pin_P0_00; -extern const mcu_pin_obj_t pin_P0_01; -extern const mcu_pin_obj_t pin_P0_02; -extern const mcu_pin_obj_t pin_P0_03; -extern const mcu_pin_obj_t pin_P0_04; -extern const mcu_pin_obj_t pin_P0_05; -extern const mcu_pin_obj_t pin_P0_06; -extern const mcu_pin_obj_t pin_P0_07; -extern const mcu_pin_obj_t pin_P0_08; -extern const mcu_pin_obj_t pin_P0_09; -extern const mcu_pin_obj_t pin_P0_10; -extern const mcu_pin_obj_t pin_P0_11; -extern const mcu_pin_obj_t pin_P0_12; -extern const mcu_pin_obj_t pin_P0_13; -extern const mcu_pin_obj_t pin_P0_14; -extern const mcu_pin_obj_t pin_P0_15; -extern const mcu_pin_obj_t pin_P0_16; -extern const mcu_pin_obj_t pin_P0_17; -extern const mcu_pin_obj_t pin_P0_18; -extern const mcu_pin_obj_t pin_P0_19; -extern const mcu_pin_obj_t pin_P0_20; -extern const mcu_pin_obj_t pin_P0_21; -extern const mcu_pin_obj_t pin_P0_22; -extern const mcu_pin_obj_t pin_P0_23; -extern const mcu_pin_obj_t pin_P0_24; -extern const mcu_pin_obj_t pin_P0_25; -extern const mcu_pin_obj_t pin_P0_26; -extern const mcu_pin_obj_t pin_P0_27; -extern const mcu_pin_obj_t pin_P0_28; -extern const mcu_pin_obj_t pin_P0_29; -extern const mcu_pin_obj_t pin_P0_30; -extern const mcu_pin_obj_t pin_P0_31; - -#endif // MICROPY_INCLUDED_NRF_PERIPHERALS_NRF52832_PINS_H diff --git a/ports/nrf/peripherals/nrf/pins.h b/ports/nrf/peripherals/nrf/pins.h index 33462d7114..3a4c995790 100644 --- a/ports/nrf/peripherals/nrf/pins.h +++ b/ports/nrf/peripherals/nrf/pins.h @@ -56,11 +56,7 @@ extern const mp_obj_type_t mcu_pin_type; // Use illegal pin value to mark unassigned pins. #define NO_PIN 0xff -// Choose based on chip, but not specifically revision (e.g., not NRF52832_XXAA) -#ifdef NRF52832 -#include "nrf52832/pins.h" -#endif - +// Choose based on chip, but not specifically revision (e.g., not NRF52840_XXAA) #ifdef NRF52840 #include "nrf52840/pins.h" #endif diff --git a/ports/nrf/supervisor/internal_flash.c b/ports/nrf/supervisor/internal_flash.c index a648afa173..5faae8a4e3 100644 --- a/ports/nrf/supervisor/internal_flash.c +++ b/ports/nrf/supervisor/internal_flash.c @@ -70,18 +70,55 @@ uint32_t supervisor_flash_get_block_count(void) { return ((uint32_t) __fatfs_flash_length) / FILESYSTEM_BLOCK_SIZE ; } -// TODO support flashing with SD enabled +#ifdef BLUETOOTH_SD +STATIC bool wait_for_flash_operation() { + do { + sd_app_evt_wait(); + uint32_t evt_id; + uint32_t result = sd_evt_get(&evt_id); + if (result == NRF_SUCCESS) { + switch (evt_id) { + case NRF_EVT_FLASH_OPERATION_SUCCESS: + return true; + + case NRF_EVT_FLASH_OPERATION_ERROR: + return false; + + default: + // Some other event. Wait for a flash event. + continue; + } + } + return false; + } while (true); +} +#endif + void supervisor_flash_flush(void) { if (_flash_page_addr == NO_CACHE) return; // Skip if data is the same if (memcmp(_flash_cache, (void *)_flash_page_addr, FL_PAGE_SZ) != 0) { -// _is_flashing = true; + +#ifdef BLUETOOTH_SD + uint8_t sd_en = 0; + (void) sd_softdevice_is_enabled(&sd_en); + + if (sd_en) { + sd_flash_page_erase(_flash_page_addr / FL_PAGE_SZ); + wait_for_flash_operation(); // TODO: handle error return. + sd_flash_write((uint32_t *)_flash_page_addr, (uint32_t *)_flash_cache, FL_PAGE_SZ / sizeof(uint32_t)); + wait_for_flash_operation(); + } else { +#endif nrf_nvmc_page_erase(_flash_page_addr); nrf_nvmc_write_words(_flash_page_addr, (uint32_t *)_flash_cache, FL_PAGE_SZ / sizeof(uint32_t)); +#ifdef BLUETOOTH_SD } +#endif _flash_page_addr = NO_CACHE; + } } mp_uint_t supervisor_flash_read_blocks(uint8_t *dest, uint32_t block, uint32_t num_blocks) { @@ -101,10 +138,6 @@ mp_uint_t supervisor_flash_write_blocks(const uint8_t *src, uint32_t lba, uint32 if (page_addr != _flash_page_addr) { supervisor_flash_flush(); - // writing previous cached data, skip current data until flashing is done - // tinyusb stack will invoke write_block() with the same parameters later on - // if ( _is_flashing ) return; - _flash_page_addr = page_addr; memcpy(_flash_cache, (void *)page_addr, FL_PAGE_SZ); } diff --git a/ports/nrf/supervisor/port.c b/ports/nrf/supervisor/port.c index 2e25c7d151..b2e98fd5b2 100644 --- a/ports/nrf/supervisor/port.c +++ b/ports/nrf/supervisor/port.c @@ -38,6 +38,7 @@ #include "shared-module/gamepad/__init__.h" #include "common-hal/microcontroller/Pin.h" +#include "common-hal/bleio/__init__.h" #include "common-hal/busio/I2C.h" #include "common-hal/busio/SPI.h" #include "common-hal/pulseio/PWMOut.h" @@ -88,6 +89,8 @@ void reset_port(void) { pulsein_reset(); timers_reset(); + bleio_reset(); + reset_all_pins(); } diff --git a/py/obj.h b/py/obj.h index 8b67728730..ece3b0ee0d 100644 --- a/py/obj.h +++ b/py/obj.h @@ -640,6 +640,7 @@ mp_obj_t mp_obj_new_str_via_qstr(const char* data, size_t len); mp_obj_t mp_obj_new_str_from_vstr(const mp_obj_type_t *type, vstr_t *vstr); mp_obj_t mp_obj_new_bytes(const byte* data, size_t len); mp_obj_t mp_obj_new_bytearray(size_t n, void *items); +mp_obj_t mp_obj_new_bytearray_of_zeros(size_t n); mp_obj_t mp_obj_new_bytearray_by_ref(size_t n, void *items); #if MICROPY_PY_BUILTINS_FLOAT mp_obj_t mp_obj_new_int_from_float(mp_float_t val); diff --git a/py/objarray.c b/py/objarray.c index 69ff6f328f..0c8c7d8556 100644 --- a/py/objarray.c +++ b/py/objarray.c @@ -611,6 +611,12 @@ mp_obj_t mp_obj_new_bytearray(size_t n, void *items) { return MP_OBJ_FROM_PTR(o); } +mp_obj_t mp_obj_new_bytearray_of_zeros(size_t n) { + mp_obj_array_t *o = array_new(BYTEARRAY_TYPECODE, n); + memset(o->items, 0, n); + return MP_OBJ_FROM_PTR(o); +} + // Create bytearray which references specified memory area mp_obj_t mp_obj_new_bytearray_by_ref(size_t n, void *items) { mp_obj_array_t *o = m_new_obj(mp_obj_array_t); diff --git a/py/runtime.c b/py/runtime.c index 3d7a97f58b..fb62edf73b 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -1599,6 +1599,17 @@ NORETURN void mp_raise_OSError(int errno_) { nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(errno_))); } +NORETURN void mp_raise_OSError_msg(const compressed_string_t *msg) { + mp_raise_msg(&mp_type_OSError, msg); +} + +NORETURN void mp_raise_OSError_msg_varg(const compressed_string_t *fmt, ...) { + va_list argptr; + va_start(argptr,fmt); + mp_obj_t exception = mp_obj_new_exception_msg_vlist(&mp_type_OSError, fmt, argptr); + va_end(argptr); + nlr_raise(exception); +} NORETURN void mp_raise_NotImplementedError(const compressed_string_t *msg) { mp_raise_msg(&mp_type_NotImplementedError, msg); diff --git a/py/runtime.h b/py/runtime.h index 9c7ffc02f5..ece226e7ab 100644 --- a/py/runtime.h +++ b/py/runtime.h @@ -158,6 +158,8 @@ NORETURN void mp_raise_RuntimeError(const compressed_string_t *msg); NORETURN void mp_raise_ImportError(const compressed_string_t *msg); NORETURN void mp_raise_IndexError(const compressed_string_t *msg); NORETURN void mp_raise_OSError(int errno_); +NORETURN void mp_raise_OSError_msg(const compressed_string_t *msg); +NORETURN void mp_raise_OSError_msg_varg(const compressed_string_t *fmt, ...); NORETURN void mp_raise_NotImplementedError(const compressed_string_t *msg); NORETURN void mp_raise_recursion_depth(void); diff --git a/shared-bindings/bleio/Address.c b/shared-bindings/bleio/Address.c index ec23ff2071..9109388445 100644 --- a/shared-bindings/bleio/Address.c +++ b/shared-bindings/bleio/Address.c @@ -33,8 +33,12 @@ #include "shared-bindings/bleio/Address.h" #include "shared-module/bleio/Address.h" -#define ADDRESS_LONG_LEN 17 // XX:XX:XX:XX:XX:XX -#define ADDRESS_SHORT_LEN 12 // XXXXXXXXXXXX +#define ADDRESS_BYTE_LEN 12 + +STATIC uint8_t xdigit_8b_value(byte nibble1, byte nibble2) { + return unichar_xdigit_value(nibble1) | (unichar_xdigit_value(nibble2) << 4); +} + //| .. currentmodule:: bleio //| @@ -49,7 +53,7 @@ //| Create a new Address object encapsulating the address value. //| The value itself can be one of: //| -//| - a `str` value in the format of 'XXXXXXXXXXXX' or 'XX:XX:XX:XX:XX' +//| - a `str` value in the format of 'XXXXXXXXXXXX' or 'XX:XX:XX:XX:XX:XX' (12 hex digits) //| - a `bytes` or `bytearray` containing 6 bytes //| - another Address object //| @@ -76,7 +80,7 @@ STATIC mp_obj_t bleio_address_make_new(const mp_obj_type_t *type, size_t n_args, enum { ARG_address }; static const mp_arg_t allowed_args[] = { - { ARG_address, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_address, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; @@ -85,26 +89,41 @@ STATIC mp_obj_t bleio_address_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t address = args[ARG_address].u_obj; if (MP_OBJ_IS_STR(address)) { - GET_STR_DATA_LEN(address, str_data, str_len); - const bool is_long = (str_len == ADDRESS_LONG_LEN); - const bool is_short = (str_len == ADDRESS_SHORT_LEN); + GET_STR_DATA_LEN(address, str, str_len); - if (is_long || is_short) { - size_t i = str_len - 1; - for (size_t b = 0; b < BLEIO_ADDRESS_BYTES; ++b) { - self->value[b] = unichar_xdigit_value(str_data[i]) | - unichar_xdigit_value(str_data[i - 1]) << 4; + size_t value_index = 0; + size_t str_index = str_len; + bool error = false; - i -= is_long ? 3 : 2; + // Loop until fewer than two characters left. + while (str_index >= 1 && value_index < sizeof(self->value)) { + if (str[str_index] == ':') { + // Skip colon separators. + str_index--; + continue; } - } else { - mp_raise_ValueError(translate("Wrong address length")); + + if (!unichar_isxdigit(str[str_index]) || + !unichar_isxdigit(str[str_index-1])) { + error = true; + break; + } + + self->value[value_index] = xdigit_8b_value(str[str_index], + str[str_index-1]); + value_index += 1; + str_index -= 2; + } + // Check for correct number of hex digits and no parsing errors. + if (error || value_index != ADDRESS_BYTE_LEN || str_index != -1) { + mp_raise_ValueError_varg(translate("Address is not %d bytes long or is in wrong format"), + ADDRESS_BYTE_LEN); } } else if (MP_OBJ_IS_TYPE(address, &mp_type_bytearray) || MP_OBJ_IS_TYPE(address, &mp_type_bytes)) { mp_buffer_info_t buf_info; mp_get_buffer_raise(address, &buf_info, MP_BUFFER_READ); if (buf_info.len != BLEIO_ADDRESS_BYTES) { - mp_raise_ValueError(translate("Wrong number of bytes provided")); + mp_raise_ValueError_varg(translate("Address must be %d bytes long"), BLEIO_ADDRESS_BYTES); } for (size_t b = 0; b < BLEIO_ADDRESS_BYTES; ++b) { diff --git a/shared-bindings/bleio/Broadcaster.c b/shared-bindings/bleio/Broadcaster.c new file mode 100644 index 0000000000..c46de1d356 --- /dev/null +++ b/shared-bindings/bleio/Broadcaster.c @@ -0,0 +1,137 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "ble_drv.h" +#include "py/runtime.h" + +#include "shared-bindings/bleio/Broadcaster.h" + +//| .. currentmodule:: bleio +//| +//| :class:`Broadcaster` -- Broadcast advertising packets. +//| ========================================================= +//| +//| Implement a BLE broadcaster which sends data in advertising packets and does not connect. +//| Used for beacons and other one-way data transmission. +//| +//| Usage:: +//| +//| import bleio +//| import time +//| +//| # Broadcast once a second. +//| broadcaster = bleio.Broadcaster(interval=1) +//| data = 0 +//| # Broadcast a byte of data that's incremented once a minute +//| while True: +//| # data is an entire advertising data packet, starting with flags. +//| broadcaster.start_advertising(data) +//| time.sleep(60) +//| data += 1 +//| +//| .. class:: Broadcaster(interval=1) +//| +//| Create a new Broadcaster object. + +//| :param float interval: how often to broadcast +//| + +STATIC mp_obj_t bleio_broadcaster_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { + mp_arg_check_num(n_args, n_kw, 0, 1, true); + bleio_broadcaster_obj_t *self = m_new_obj(bleio_broadcaster_obj_t); + self->base.type = &bleio_broadcaster_type; + + mp_map_t kw_args; + mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); + + enum { ARG_interval }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_interval, MP_ARG_OBJ, {.u_obj = MP_OBJ_NEW_SMALL_INT(1)} }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + mp_float_t interval = mp_obj_get_float(args[ARG_interval].u_obj); + + // Do port-specific initialization. interval will be validated. + common_hal_bleio_broadcaster_construct(self, interval); + + return MP_OBJ_FROM_PTR(self); +} + +//| .. method:: start_advertising(data) +//| +//| Start advertising using the given data packet. +//| +//| :param buf data: advertising data packet, starting with advertising data flags (0x01) +//| +STATIC mp_obj_t bleio_broadcaster_start_advertising(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + bleio_broadcaster_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); + + enum { ARG_data }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_data, MP_ARG_REQUIRED | MP_ARG_OBJ }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(args[ARG_data].u_obj, &bufinfo, MP_BUFFER_READ); + + common_hal_bleio_broadcaster_start_advertising(self, &bufinfo); + + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_broadcaster_start_advertising_obj, 0, bleio_broadcaster_start_advertising); + +//| .. method:: stop_advertising() +//| +//| Stop sending advertising packets. +STATIC mp_obj_t bleio_broadcaster_stop_advertising(mp_obj_t self_in) { + bleio_broadcaster_obj_t *self = MP_OBJ_TO_PTR(self_in); + + common_hal_bleio_broadcaster_stop_advertising(self); + + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_broadcaster_stop_advertising_obj, bleio_broadcaster_stop_advertising); + +STATIC const mp_rom_map_elem_t bleio_broadcaster_locals_dict_table[] = { + // Methods + { MP_ROM_QSTR(MP_QSTR_start_advertising), MP_ROM_PTR(&bleio_broadcaster_start_advertising_obj) }, + { MP_ROM_QSTR(MP_QSTR_stop_advertising), MP_ROM_PTR(&bleio_broadcaster_stop_advertising_obj) }, +}; + +STATIC MP_DEFINE_CONST_DICT(bleio_broadcaster_locals_dict, bleio_broadcaster_locals_dict_table); + +const mp_obj_type_t bleio_broadcaster_type = { + { &mp_type_type }, + .name = MP_QSTR_Broadcaster, + .make_new = bleio_broadcaster_make_new, + .locals_dict = (mp_obj_dict_t*)&bleio_broadcaster_locals_dict +}; diff --git a/shared-bindings/bleio/Broadcaster.h b/shared-bindings/bleio/Broadcaster.h new file mode 100644 index 0000000000..8aa125af97 --- /dev/null +++ b/shared-bindings/bleio/Broadcaster.h @@ -0,0 +1,38 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Artur Pacholec + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_BROADCASTER_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_BROADCASTER_H + +#include "common-hal/bleio/Broadcaster.h" + +extern const mp_obj_type_t bleio_broadcaster_type; + +extern void common_hal_bleio_broadcaster_construct(bleio_broadcaster_obj_t *self, mp_float_t interval); +extern void common_hal_bleio_broadcaster_start_advertising(bleio_broadcaster_obj_t *self, mp_buffer_info_t *data); +extern void common_hal_bleio_broadcaster_stop_advertising(bleio_broadcaster_obj_t *self); + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_BROADCASTER_H diff --git a/shared-bindings/bleio/Characteristic.c b/shared-bindings/bleio/Characteristic.c index 369f3f991d..0a3fada139 100644 --- a/shared-bindings/bleio/Characteristic.c +++ b/shared-bindings/bleio/Characteristic.c @@ -35,78 +35,41 @@ //| :class:`Characteristic` -- BLE service characteristic //| ========================================================= //| -//| Stores information about a BLE service characteristic and allows to read -//| and write the characteristic's value. +//| Stores information about a BLE service characteristic and allows reading +//| and writing of the characteristic's value. //| - -//| .. class:: Characteristic(uuid) +//| +//| .. class:: Characteristic(uuid, *, broadcast=False, indicate=False, notify=False, read=False, write=False, write_no_response=False) //| //| Create a new Characteristic object identified by the specified UUID. //| //| :param bleio.UUID uuid: The uuid of the characteristic +//| :param bool broadcast: Allowed in advertising packets +//| :param bool indicate: Server will indicate to the client when the value is set and wait for a response +//| :param bool notify: Server will notify the client when the value is set +//| :param bool read: Clients may read this characteristic +//| :param bool write: Clients may write this characteristic; a response will be sent back +//| :param bool write_no_response: Clients may write this characteristic; no response will be sent back //| - -//| .. attribute:: broadcast -//| -//| A `bool` specifying if the characteristic allows broadcasting its value. -//| - -//| .. attribute:: indicate -//| -//| A `bool` specifying if the characteristic allows indicating its value. -//| - -//| .. attribute:: notify -//| -//| A `bool` specifying if the characteristic allows notifying its value. -//| - -//| .. attribute:: read -//| -//| A `bool` specifying if the characteristic allows reading its value. -//| - -//| .. attribute:: uuid -//| -//| The UUID of this characteristic. (read-only) -//| - -//| .. attribute:: value -//| -//| The value of this characteristic. The value can be written to if the `write` property allows it. -//| If the `read` property allows it, the value can be read. If the `notify` property is set, writting -//| to the value will generate a BLE notification. -//| - -//| .. attribute:: write -//| -//| A `bool` specifying if the characteristic allows writting to its value. -//| - -//| .. attribute:: write_no_resp -//| -//| A `bool` specifying if the characteristic allows writting to its value without response. -//| -STATIC void bleio_characteristic_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { - bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); - - mp_printf(print, "Characteristic(uuid: 0x"HEX2_FMT""HEX2_FMT" handle: 0x" HEX2_FMT ")", - self->uuid->value[1], self->uuid->value[0], self->handle); -} - STATIC mp_obj_t bleio_characteristic_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { mp_arg_check_num(n_args, n_kw, 1, 1, true); bleio_characteristic_obj_t *self = m_new_obj(bleio_characteristic_obj_t); self->base.type = &bleio_characteristic_type; - self->service = NULL; - self->value_data = NULL; mp_map_t kw_args; mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); - enum { ARG_uuid }; + enum { + ARG_uuid, ARG_broadcast, ARG_indicate, ARG_notify, ARG_read, ARG_write, ARG_write_no_response, + }; static const mp_arg_t allowed_args[] = { - { MP_QSTR_uuid, MP_ARG_REQUIRED| MP_ARG_OBJ, {.u_obj = mp_const_none} }, + { MP_QSTR_uuid, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = mp_const_none} }, + { MP_QSTR_broadcast, MP_ARG_KW_ONLY| MP_ARG_BOOL, {.u_bool = false} }, + { MP_QSTR_indicate, MP_ARG_KW_ONLY| MP_ARG_BOOL, {.u_bool = false} }, + { MP_QSTR_notify, MP_ARG_KW_ONLY| MP_ARG_BOOL, {.u_bool = false} }, + { MP_QSTR_read, MP_ARG_KW_ONLY| MP_ARG_BOOL, {.u_bool = false} }, + { MP_QSTR_write, MP_ARG_KW_ONLY| MP_ARG_BOOL, {.u_bool = false} }, + { MP_QSTR_write_no_response, MP_ARG_KW_ONLY| MP_ARG_BOOL, {.u_bool = false} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; @@ -114,22 +77,30 @@ STATIC mp_obj_t bleio_characteristic_make_new(const mp_obj_type_t *type, size_t const mp_obj_t uuid = args[ARG_uuid].u_obj; - if (uuid == mp_const_none) { - return MP_OBJ_FROM_PTR(self); + if (!MP_OBJ_IS_TYPE(uuid, &bleio_uuid_type)) { + mp_raise_ValueError(translate("Expected a UUID")); } - if (MP_OBJ_IS_TYPE(uuid, &bleio_uuid_type)) { - self->uuid = MP_OBJ_TO_PTR(uuid); - } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, - translate("Invalid UUID parameter"))); - } + self->uuid = MP_OBJ_TO_PTR(uuid); - common_hal_bleio_characteristic_construct(self); + bleio_characteristic_properties_t properties; + + properties.broadcast = args[ARG_broadcast].u_bool; + properties.indicate = args[ARG_indicate].u_bool; + properties.notify = args[ARG_notify].u_bool; + properties.read = args[ARG_read].u_bool; + properties.write = args[ARG_write].u_bool; + properties.write_no_response = args[ARG_write_no_response].u_bool; + + common_hal_bleio_characteristic_construct(self, uuid, properties); return MP_OBJ_FROM_PTR(self); } +//| .. attribute:: broadcast +//| +//| A `bool` specifying if the characteristic allows broadcasting its value. (read-only) +//| STATIC mp_obj_t bleio_characteristic_get_broadcast(mp_obj_t self_in) { bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -137,22 +108,17 @@ STATIC mp_obj_t bleio_characteristic_get_broadcast(mp_obj_t self_in) { } STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_get_broadcast_obj, bleio_characteristic_get_broadcast); -STATIC mp_obj_t bleio_characteristic_set_broadcast(mp_obj_t self_in, mp_obj_t broadcast_in) { - bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); - - self->props.broadcast = mp_obj_is_true(broadcast_in); - - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(bleio_characteristic_set_broadcast_obj, bleio_characteristic_set_broadcast); - const mp_obj_property_t bleio_characteristic_broadcast_obj = { .base.type = &mp_type_property, .proxy = { (mp_obj_t)&bleio_characteristic_get_broadcast_obj, - (mp_obj_t)&bleio_characteristic_set_broadcast_obj, + (mp_obj_t)&mp_const_none_obj, (mp_obj_t)&mp_const_none_obj }, }; +//| .. attribute:: indicate +//| +//| A `bool` specifying if the characteristic allows indicating its value. (read-only) +//| STATIC mp_obj_t bleio_characteristic_get_indicate(mp_obj_t self_in) { bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -160,22 +126,18 @@ STATIC mp_obj_t bleio_characteristic_get_indicate(mp_obj_t self_in) { } STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_get_indicate_obj, bleio_characteristic_get_indicate); -STATIC mp_obj_t bleio_characteristic_set_indicate(mp_obj_t self_in, mp_obj_t indicate_in) { - bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); - - self->props.indicate = mp_obj_is_true(indicate_in); - - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(bleio_characteristic_set_indicate_obj, bleio_characteristic_set_indicate); const mp_obj_property_t bleio_characteristic_indicate_obj = { .base.type = &mp_type_property, .proxy = { (mp_obj_t)&bleio_characteristic_get_indicate_obj, - (mp_obj_t)&bleio_characteristic_set_indicate_obj, + (mp_obj_t)&mp_const_none_obj, (mp_obj_t)&mp_const_none_obj }, }; +//| .. attribute:: notify +//| +//| A `bool` specifying if the characteristic allows notifying its value. (read-only) +//| STATIC mp_obj_t bleio_characteristic_get_notify(mp_obj_t self_in) { bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -183,22 +145,17 @@ STATIC mp_obj_t bleio_characteristic_get_notify(mp_obj_t self_in) { } STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_get_notify_obj, bleio_characteristic_get_notify); -STATIC mp_obj_t bleio_characteristic_set_notify(mp_obj_t self_in, mp_obj_t notify_in) { - bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); - - self->props.notify = mp_obj_is_true(notify_in); - - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(bleio_characteristic_set_notify_obj, bleio_characteristic_set_notify); - const mp_obj_property_t bleio_characteristic_notify_obj = { .base.type = &mp_type_property, .proxy = { (mp_obj_t)&bleio_characteristic_get_notify_obj, - (mp_obj_t)&bleio_characteristic_set_notify_obj, + (mp_obj_t)&mp_const_none_obj, (mp_obj_t)&mp_const_none_obj }, }; +//| .. attribute:: read +//| +//| A `bool` specifying if the characteristic allows reading its value. (read-only) +//| STATIC mp_obj_t bleio_characteristic_get_read(mp_obj_t self_in) { bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -206,22 +163,17 @@ STATIC mp_obj_t bleio_characteristic_get_read(mp_obj_t self_in) { } STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_get_read_obj, bleio_characteristic_get_read); -STATIC mp_obj_t bleio_characteristic_set_read(mp_obj_t self_in, mp_obj_t read_in) { - bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); - - self->props.read = mp_obj_is_true(read_in); - - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(bleio_characteristic_set_read_obj, bleio_characteristic_set_read); - const mp_obj_property_t bleio_characteristic_read_obj = { .base.type = &mp_type_property, .proxy = { (mp_obj_t)&bleio_characteristic_get_read_obj, - (mp_obj_t)&bleio_characteristic_set_read_obj, + (mp_obj_t)&mp_const_none_obj, (mp_obj_t)&mp_const_none_obj }, }; +//| .. attribute:: write +//| +//| A `bool` specifying if the characteristic allows writing to its value. (read-only) +//| STATIC mp_obj_t bleio_characteristic_get_write(mp_obj_t self_in) { bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -229,45 +181,35 @@ STATIC mp_obj_t bleio_characteristic_get_write(mp_obj_t self_in) { } STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_get_write_obj, bleio_characteristic_get_write); -STATIC mp_obj_t bleio_characteristic_set_write(mp_obj_t self_in, mp_obj_t write_in) { - bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); - - self->props.write = mp_obj_is_true(write_in); - - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(bleio_characteristic_set_write_obj, bleio_characteristic_set_write); - const mp_obj_property_t bleio_characteristic_write_obj = { .base.type = &mp_type_property, .proxy = { (mp_obj_t)&bleio_characteristic_get_write_obj, - (mp_obj_t)&bleio_characteristic_set_write_obj, + (mp_obj_t)&mp_const_none_obj, (mp_obj_t)&mp_const_none_obj }, }; -STATIC mp_obj_t bleio_characteristic_get_write_wo_resp(mp_obj_t self_in) { +//| .. attribute:: write_no_response +//| +//| A `bool` specifying if the characteristic allows writing to its value without response. (read-only) +//| +STATIC mp_obj_t bleio_characteristic_get_write_no_response(mp_obj_t self_in) { bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); - return mp_obj_new_bool(self->props.write_wo_resp); + return mp_obj_new_bool(self->props.write_no_response); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_get_write_wo_resp_obj, bleio_characteristic_get_write_wo_resp); +STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_get_write_no_response_obj, bleio_characteristic_get_write_no_response); -STATIC mp_obj_t bleio_characteristic_set_write_wo_resp(mp_obj_t self_in, mp_obj_t write_wo_resp_in) { - bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); - - self->props.write_wo_resp = mp_obj_is_true(write_wo_resp_in); - - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(bleio_characteristic_set_write_wo_resp_obj, bleio_characteristic_set_write_wo_resp); - -const mp_obj_property_t bleio_characteristic_write_wo_resp_obj = { +const mp_obj_property_t bleio_characteristic_write_no_response_obj = { .base.type = &mp_type_property, - .proxy = { (mp_obj_t)&bleio_characteristic_get_write_wo_resp_obj, - (mp_obj_t)&bleio_characteristic_set_write_wo_resp_obj, + .proxy = { (mp_obj_t)&bleio_characteristic_get_write_no_response_obj, + (mp_obj_t)&mp_const_none_obj, (mp_obj_t)&mp_const_none_obj }, }; +//| .. attribute:: uuid +//| +//| The UUID of this characteristic. (read-only) +//| STATIC mp_obj_t bleio_characteristic_get_uuid(mp_obj_t self_in) { bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -282,10 +224,16 @@ const mp_obj_property_t bleio_characteristic_uuid_obj = { (mp_obj_t)&mp_const_none_obj }, }; +//| .. attribute:: value +//| +//| The value of this characteristic. The value can be written to if the `write` property allows it. +//| If the `read` property allows it, the value can be read. If the `notify` property is set, writing +//| to the value will generate a BLE notification. +//| STATIC mp_obj_t bleio_characteristic_get_value(mp_obj_t self_in) { bleio_characteristic_obj_t *self = MP_OBJ_TO_PTR(self_in); - common_hal_bleio_characteristic_read_value(self); + common_hal_bleio_characteristic_get_value(self); return self->value_data; } @@ -297,7 +245,7 @@ STATIC mp_obj_t bleio_characteristic_set_value(mp_obj_t self_in, mp_obj_t value_ mp_buffer_info_t bufinfo; mp_get_buffer_raise(value_in, &bufinfo, MP_BUFFER_READ); - common_hal_bleio_characteristic_write_value(self, &bufinfo); + common_hal_bleio_characteristic_set_value(self, &bufinfo); return mp_const_none; } @@ -318,7 +266,7 @@ STATIC const mp_rom_map_elem_t bleio_characteristic_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_uuid), MP_ROM_PTR(&bleio_characteristic_uuid_obj) }, { MP_ROM_QSTR(MP_QSTR_value), MP_ROM_PTR(&bleio_characteristic_value_obj) }, { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&bleio_characteristic_write_obj) }, - { MP_ROM_QSTR(MP_QSTR_write_wo_resp), MP_ROM_PTR(&bleio_characteristic_write_wo_resp_obj) }, + { MP_ROM_QSTR(MP_QSTR_write_no_response), MP_ROM_PTR(&bleio_characteristic_write_no_response_obj) }, }; STATIC MP_DEFINE_CONST_DICT(bleio_characteristic_locals_dict, bleio_characteristic_locals_dict_table); @@ -326,7 +274,6 @@ STATIC MP_DEFINE_CONST_DICT(bleio_characteristic_locals_dict, bleio_characterist const mp_obj_type_t bleio_characteristic_type = { { &mp_type_type }, .name = MP_QSTR_Characteristic, - .print = bleio_characteristic_print, .make_new = bleio_characteristic_make_new, .locals_dict = (mp_obj_dict_t*)&bleio_characteristic_locals_dict }; diff --git a/shared-bindings/bleio/Characteristic.h b/shared-bindings/bleio/Characteristic.h index 0e99e97ccd..206cbcd403 100644 --- a/shared-bindings/bleio/Characteristic.h +++ b/shared-bindings/bleio/Characteristic.h @@ -27,12 +27,12 @@ #ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CHARACTERISTIC_H #define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CHARACTERISTIC_H -#include "shared-module/bleio/Characteristic.h" +#include "common-hal/bleio/Characteristic.h" extern const mp_obj_type_t bleio_characteristic_type; -extern void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self); -extern void common_hal_bleio_characteristic_read_value(bleio_characteristic_obj_t *self); -extern void common_hal_bleio_characteristic_write_value(bleio_characteristic_obj_t *self, mp_buffer_info_t *bufinfo); +extern void common_hal_bleio_characteristic_construct(bleio_characteristic_obj_t *self, bleio_uuid_obj_t *uuid, bleio_characteristic_properties_t props); +extern void common_hal_bleio_characteristic_get_value(bleio_characteristic_obj_t *self); +extern void common_hal_bleio_characteristic_set_value(bleio_characteristic_obj_t *self, mp_buffer_info_t *bufinfo); #endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CHARACTERISTIC_H diff --git a/shared-bindings/bleio/CharacteristicBuffer.c b/shared-bindings/bleio/CharacteristicBuffer.c new file mode 100644 index 0000000000..f0578a7adf --- /dev/null +++ b/shared-bindings/bleio/CharacteristicBuffer.c @@ -0,0 +1,120 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2018 Dan Halbert for Adafruit Industries + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "py/objproperty.h" +#include "py/runtime.h" +#include "shared-bindings/bleio/CharacteristicBuffer.h" +#include "shared-bindings/bleio/UUID.h" + +//| .. currentmodule:: bleio +//| +//| :class:`CharacteristicBuffer` -- BLE Service incoming values buffer. +//| ===================================================================== +//| +//| Accumulates a Characteristic's incoming values in a FIFO buffer. +//| +//| .. class:: CharacteristicBuffer(Characteristic, buffer_size=0) +//| +//| Create a new Characteristic object identified by the specified UUID. +//| +//| :param bleio.Characteristic characteristic: The characteristic to monitor +//| :param int buffer_size: Size of ring buffer that stores incoming data coming from client. +//| Must be >= 1. +//| +STATIC mp_obj_t bleio_characteristic_buffer_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { + mp_arg_check_num(n_args, n_kw, 1, 2, true); + bleio_characteristic_buffer_obj_t *self = m_new_obj(bleio_characteristic_buffer_obj_t); + self->base.type = &bleio_characteristic_buffer_type; + + mp_map_t kw_args; + mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); + + enum { ARG_characteristic, ARG_buffer_size, }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_characteristic, MP_ARG_REQUIRED | MP_ARG_OBJ }, + { MP_QSTR_buffer_size, MP_ARG_REQUIRED | MP_ARG_INT }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + const mp_obj_t characteristic = args[ARG_characteristic].u_obj; + const int buffer_size = args[ARG_buffer_size].u_int; + + if (buffer_size < 1) { + mp_raise_ValueError(translate("buffer_size must be >= 1")); + } + + if (!MP_OBJ_IS_TYPE(characteristic, &bleio_characteristic_type)) { + mp_raise_ValueError(translate("Expected a Characteristic")); + } + + self->characteristic = MP_OBJ_TO_PTR(characteristic); + + common_hal_bleio_characteristic_buffer_construct(self, self->characteristic, buffer_size); + + return MP_OBJ_FROM_PTR(self); +} + + +//| .. method:: read() +//| +//| Read a single byte from the buffer. If no character is available, return None. +STATIC mp_obj_t bleio_characteristic_buffer_read(mp_obj_t self_in) { + bleio_characteristic_buffer_obj_t *self = MP_OBJ_TO_PTR(self_in); + + int byte = common_hal_bleio_characteristic_buffer_read(self); + if (byte == -1) { + return mp_const_none; + } + + return MP_OBJ_NEW_SMALL_INT(byte); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_buffer_read_obj, bleio_characteristic_buffer_read); + +//| .. method:: deinit() +//| +//| Disable permanently. +STATIC mp_obj_t bleio_characteristic_buffer_deinit(mp_obj_t self_in) { + bleio_characteristic_buffer_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_bleio_characteristic_buffer_deinit(self); + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_characteristic_buffer_deinit_obj, bleio_characteristic_buffer_deinit); + +STATIC const mp_rom_map_elem_t bleio_characteristic_buffer_locals_dict_table[] = { + { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&bleio_characteristic_buffer_read_obj) }, + { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&bleio_characteristic_buffer_deinit_obj) }, +}; + +STATIC MP_DEFINE_CONST_DICT(bleio_characteristic_buffer_locals_dict, bleio_characteristic_buffer_locals_dict_table); + +const mp_obj_type_t bleio_characteristic_buffer_type = { + { &mp_type_type }, + .name = MP_QSTR_CharacteristicBuffer, + .make_new = bleio_characteristic_buffer_make_new, + .locals_dict = (mp_obj_dict_t*)&bleio_characteristic_buffer_locals_dict +}; diff --git a/ports/nrf/boards/feather_nrf52832/mpconfigboard.h b/shared-bindings/bleio/CharacteristicBuffer.h similarity index 59% rename from ports/nrf/boards/feather_nrf52832/mpconfigboard.h rename to shared-bindings/bleio/CharacteristicBuffer.h index 4959e1ca95..c5d7580da3 100644 --- a/ports/nrf/boards/feather_nrf52832/mpconfigboard.h +++ b/shared-bindings/bleio/CharacteristicBuffer.h @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (c) 2017 Glenn Ruben Bakke + * Copyright (c) 2018 Artur Pacholec * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,24 +24,16 @@ * THE SOFTWARE. */ -#define MICROPY_HW_BOARD_NAME "Bluefruit nRF52 Feather" -#define MICROPY_HW_MCU_NAME "nRF52832" -#define MICROPY_PY_SYS_PLATFORM "nRF52" +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CHARACTERISTICBUFFER_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CHARACTERISTICBUFFER_H -#define MICROPY_HW_LED_STATUS (&pin_P0_17) +#include "common-hal/bleio/CharacteristicBuffer.h" -#define MICROPY_HW_UART_RX NRF_GPIO_PIN_MAP(0, 8) -#define MICROPY_HW_UART_TX NRF_GPIO_PIN_MAP(0, 6) +extern const mp_obj_type_t bleio_characteristic_buffer_type; -#define PORT_HEAP_SIZE (32 * 1024) -#define CIRCUITPY_AUTORELOAD_DELAY_MS 500 +extern void common_hal_bleio_characteristic_buffer_construct(bleio_characteristic_buffer_obj_t *self, bleio_characteristic_obj_t *characteristic, size_t buffer_size); +// Returns a uint8_t byte value, or -1 if no data is available. +int common_hal_bleio_characteristic_buffer_read(bleio_characteristic_buffer_obj_t *self); +int common_hal_bleio_characteristic_buffer_deinit(bleio_characteristic_buffer_obj_t *self); -#define DEFAULT_I2C_BUS_SCL (&pin_P0_26) -#define DEFAULT_I2C_BUS_SDA (&pin_P0_25) - -#define DEFAULT_SPI_BUS_SCK (&pin_P0_12) -#define DEFAULT_SPI_BUS_MOSI (&pin_P0_13) -#define DEFAULT_SPI_BUS_MISO (&pin_P0_14) - -#define DEFAULT_UART_BUS_RX (&pin_P0_08) -#define DEFAULT_UART_BUS_TX (&pin_P0_06) +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_CHARACTERISTICBUFFER_H diff --git a/shared-bindings/bleio/Descriptor.c b/shared-bindings/bleio/Descriptor.c index df32a00e7c..4022632ad2 100644 --- a/shared-bindings/bleio/Descriptor.c +++ b/shared-bindings/bleio/Descriptor.c @@ -61,7 +61,6 @@ enum { //| .. class:: Descriptor(uuid) //| //| Create a new descriptor object with the UUID uuid. -//| The value can be either of type `bleio.UUID` or any value allowed by the `bleio.UUID` constructor. //| .. attribute:: handle //| @@ -82,7 +81,7 @@ STATIC mp_obj_t bleio_descriptor_make_new(const mp_obj_type_t *type, size_t n_ar enum { ARG_uuid }; static const mp_arg_t allowed_args[] = { - { ARG_uuid, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, + { MP_QSTR_uuid, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; @@ -90,24 +89,16 @@ STATIC mp_obj_t bleio_descriptor_make_new(const mp_obj_type_t *type, size_t n_ar const mp_obj_t uuid_arg = args[ARG_uuid].u_obj; - bleio_uuid_obj_t *uuid; - if (MP_OBJ_IS_TYPE(uuid_arg, &bleio_uuid_type)) { - uuid = MP_OBJ_TO_PTR(uuid_arg); - } else { - uuid = MP_OBJ_TO_PTR(bleio_uuid_type.make_new(&bleio_uuid_type, 1, 0, &uuid_arg)); + if (!MP_OBJ_IS_TYPE(uuid_arg, &bleio_uuid_type)) { + mp_raise_ValueError(translate("Expected a UUID")); } + bleio_uuid_obj_t *uuid = MP_OBJ_TO_PTR(uuid_arg); common_hal_bleio_descriptor_construct(self, uuid); return MP_OBJ_FROM_PTR(self); } -STATIC void bleio_descriptor_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { - bleio_descriptor_obj_t *self = MP_OBJ_TO_PTR(self_in); - - common_hal_bleio_descriptor_print(self, print); -} - STATIC mp_obj_t bleio_descriptor_get_handle(mp_obj_t self_in) { bleio_descriptor_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -124,9 +115,7 @@ const mp_obj_property_t bleio_descriptor_handle_obj = { STATIC mp_obj_t bleio_descriptor_get_uuid(mp_obj_t self_in) { bleio_descriptor_obj_t *self = MP_OBJ_TO_PTR(self_in); - const mp_obj_t uuid = mp_obj_new_int(common_hal_bleio_descriptor_get_uuid(self)); - - return bleio_uuid_type.make_new(&bleio_uuid_type, 1, 0, &uuid); + return common_hal_bleio_descriptor_get_uuid(self); } MP_DEFINE_CONST_FUN_OBJ_1(bleio_descriptor_get_uuid_obj, bleio_descriptor_get_uuid); @@ -165,7 +154,6 @@ STATIC MP_DEFINE_CONST_DICT(bleio_descriptor_locals_dict, bleio_descriptor_local const mp_obj_type_t bleio_descriptor_type = { { &mp_type_type }, .name = MP_QSTR_Descriptor, - .print = bleio_descriptor_print, .make_new = bleio_descriptor_make_new, .locals_dict = (mp_obj_dict_t*)&bleio_descriptor_locals_dict }; diff --git a/shared-bindings/bleio/Descriptor.h b/shared-bindings/bleio/Descriptor.h index 85310d304f..f47378ee16 100644 --- a/shared-bindings/bleio/Descriptor.h +++ b/shared-bindings/bleio/Descriptor.h @@ -33,8 +33,7 @@ extern const mp_obj_type_t bleio_descriptor_type; extern void common_hal_bleio_descriptor_construct(bleio_descriptor_obj_t *self, bleio_uuid_obj_t *uuid); -extern void common_hal_bleio_descriptor_print(bleio_descriptor_obj_t *self, const mp_print_t *print); extern mp_int_t common_hal_bleio_descriptor_get_handle(bleio_descriptor_obj_t *self); -extern mp_int_t common_hal_bleio_descriptor_get_uuid(bleio_descriptor_obj_t *self); +extern mp_obj_t common_hal_bleio_descriptor_get_uuid(bleio_descriptor_obj_t *self); #endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_DESCRIPTOR_H diff --git a/shared-bindings/bleio/Device.c b/shared-bindings/bleio/Device.c index 94834ef7c0..cbad9fb7ea 100644 --- a/shared-bindings/bleio/Device.c +++ b/shared-bindings/bleio/Device.c @@ -52,10 +52,10 @@ //| When a device is created without any parameter passed to the constructor, //| it will be set to the Peripheral role. If a address is passed, the device //| will be a Central. For a Peripheral you can set the `name`, add services -//| via `add_service` and then start and stop advertising via `start_advertising` -//| and `stop_advertising`. For the Central, you can `bleio.Device.connect` and `bleio.Device.disconnect` +//| via `add_service` and then start and stop advertising via `bleio.Device.start_advertising` +//| and `bleio.Device.stop_advertising`. For the Central, you can `bleio.Device.connect` and `bleio.Device.disconnect` //| to the device, once a connection is established, the device's services can -//| be accessed using `services`. +//| be accessed using `bleio.Device.services`. //| //| Usage:: //| @@ -171,7 +171,7 @@ STATIC mp_obj_t bleio_device_make_new(const mp_obj_type_t *type, size_t n_args, enum { ARG_address, ARG_scan_entry }; static const mp_arg_t allowed_args[] = { - { ARG_address, MP_ARG_OBJ, {.u_obj = mp_const_none} }, + { MP_QSTR_address, MP_ARG_OBJ, {.u_obj = mp_const_none} }, { MP_QSTR_scan_entry, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} }, }; diff --git a/shared-bindings/bleio/Peripheral.c b/shared-bindings/bleio/Peripheral.c new file mode 100644 index 0000000000..cea44486f6 --- /dev/null +++ b/shared-bindings/bleio/Peripheral.c @@ -0,0 +1,251 @@ +/* + * This file is part of the MicroPython project, http://micropython.org/ + * + * The MIT License (MIT) + * + * Copyright (c) 2016 Glenn Ruben Bakke + * Copyright (c) 2018 Artur Pacholec + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include +#include + +#include "ble_drv.h" +#include "py/objarray.h" +#include "py/objproperty.h" +#include "py/objstr.h" +#include "py/runtime.h" + +#include "shared-bindings/bleio/Adapter.h" +#include "shared-bindings/bleio/AddressType.h" +#include "shared-bindings/bleio/Characteristic.h" +#include "shared-bindings/bleio/Peripheral.h" +#include "shared-bindings/bleio/Service.h" +#include "shared-bindings/bleio/UUID.h" +#include "shared-module/bleio/AdvertisementData.h" +#include "shared-module/bleio/ScanEntry.h" + +#include "common-hal/bleio/Peripheral.h" + +// TODO: Add unique MAC address part to name +static const char default_name[] = "CIRCUITPY"; + +//| .. currentmodule:: bleio +//| +//| :class:`Peripheral` -- A BLE peripheral device +//| ========================================================= +//| +//| Implement a BLE peripheral which runs locally. +//| Set up using the supplied services, and then allow advertising to be started and stopped. +//| +//| Usage:: +//| +//| import bleio +//| +//| # Create a Characteristic. +//| chara = bleio.Characteristic(bleio.UUID(0x2919), read=True, notify=True) +//| +//| # Create a Service providing that one Characteristic. +//| serv = bleio.Service(bleio.UUID(0x180f), [chara]) +//| +//| # Create a peripheral and start it up. +//| periph = bleio.Peripheral([service]) +//| periph.start_advertising() +//| +//| while not periph.connected(): +//| # Wait for connection. +//| pass +//| +//| .. class:: Peripheral(services, *, name='CIRCUITPY') +//| +//| Create a new Peripheral object. + +//| :param iterable services: the Service objects representing services available from this peripheral. +//| :param str name: The name used when advertising this peripheral +//| + +STATIC mp_obj_t bleio_peripheral_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { + mp_arg_check_num(n_args, n_kw, 0, 1, true); + bleio_peripheral_obj_t *self = m_new_obj(bleio_peripheral_obj_t); + self->base.type = &bleio_peripheral_type; + self->service_list = mp_obj_new_list(0, NULL); + self->notif_handler = mp_const_none; + + mp_map_t kw_args; + mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); + + enum { ARG_services, ARG_name }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_services, MP_ARG_OBJ, {.u_obj = mp_const_none} }, + { MP_QSTR_name, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + // If services is not an iterable, an exception will be thrown. + mp_obj_iter_buf_t iter_buf; + mp_obj_t iterable = mp_getiter(args[ARG_services].u_obj, &iter_buf); + mp_obj_t service; + + while ((service = mp_iternext(iterable)) != MP_OBJ_STOP_ITERATION) { + if (!MP_OBJ_IS_TYPE(service, &bleio_service_type)) { + mp_raise_ValueError(translate("services includes an object that is not a Service")); + } + bleio_service_obj_t *service_ptr = MP_OBJ_TO_PTR(service); + service_ptr->device = MP_OBJ_FROM_PTR(self); + mp_obj_list_append(self->service_list, service); + } + + const mp_obj_t name = args[ARG_name].u_obj; + if (name == mp_const_none) { + self->name = mp_obj_new_str(default_name, strlen(default_name)); + } else if (MP_OBJ_IS_STR(name)) { + self->name = name; + } else { + mp_raise_ValueError(translate("name must be a string")); + } + + // Do port-specific initialization. + common_hal_bleio_peripheral_construct(self); + + return MP_OBJ_FROM_PTR(self); +} + +//| .. attribute:: connected +//| +//| True if connected to a BLE Central device. +//| +STATIC mp_obj_t bleio_peripheral_get_connected(mp_obj_t self_in) { + bleio_peripheral_obj_t *self = MP_OBJ_TO_PTR(self_in); + + // Return list as a tuple so user won't be able to change it. + return mp_obj_new_bool(common_hal_bleio_peripheral_get_connected(self)); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_peripheral_get_connected_obj, bleio_peripheral_get_connected); + +const mp_obj_property_t bleio_peripheral_connected_obj = { + .base.type = &mp_type_property, + .proxy = { (mp_obj_t)&bleio_peripheral_get_connected_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj }, +}; + +//| .. attribute:: services +//| +//| A `tuple` of `bleio.Service` that are offered by this peripheral. (read-only) +//| +STATIC mp_obj_t bleio_peripheral_get_services(mp_obj_t self_in) { + bleio_peripheral_obj_t *self = MP_OBJ_TO_PTR(self_in); + // Return list as a tuple so user won't be able to change it. + mp_obj_list_t *service_list = MP_OBJ_TO_PTR(self->service_list); + return mp_obj_new_tuple(service_list->len, service_list->items); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_peripheral_get_services_obj, bleio_peripheral_get_services); + +const mp_obj_property_t bleio_peripheral_services_obj = { + .base.type = &mp_type_property, + .proxy = { (mp_obj_t)&bleio_peripheral_get_services_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj }, +}; + +//| .. attribute:: name +//| +//| The peripheral's name, included when advertising. (read-only) +//| +STATIC mp_obj_t bleio_peripheral_get_name(mp_obj_t self_in) { + bleio_peripheral_obj_t *self = MP_OBJ_TO_PTR(self_in); + + return self->name; +} +MP_DEFINE_CONST_FUN_OBJ_1(bleio_peripheral_get_name_obj, bleio_peripheral_get_name); + +const mp_obj_property_t bleio_peripheral_name_obj = { + .base.type = &mp_type_property, + .proxy = { (mp_obj_t)&bleio_peripheral_get_name_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj }, +}; + +//| .. method:: start_advertising(*, connectable=True, data=None) +//| +//| Starts advertising the peripheral. The peripheral's name and +//| services are included in the advertisement packets. +//| +//| :param bool connectable: If `True` then other devices are allowed to connect to this peripheral. +//| :param buf data: If `None`, advertise the services passed to this Peripheral when it was created. +//| If not `None`, then send the bytes in ``data`` as the advertising packet. +//| +STATIC mp_obj_t bleio_peripheral_start_advertising(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + bleio_peripheral_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); + + enum { ARG_connectable, ARG_data }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_connectable, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = true} }, + { MP_QSTR_data, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + mp_buffer_info_t bufinfo = { 0 }; + if (args[ARG_data].u_obj != mp_const_none) { + mp_get_buffer_raise(args[ARG_data].u_obj, &bufinfo, MP_BUFFER_READ); + } + + common_hal_bleio_peripheral_start_advertising(self, args[ARG_connectable].u_bool, &bufinfo); + + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_KW(bleio_peripheral_start_advertising_obj, 0, bleio_peripheral_start_advertising); + +//| .. method:: stop_advertising() +//| +//| Stop sending advertising packets. +STATIC mp_obj_t bleio_peripheral_stop_advertising(mp_obj_t self_in) { + bleio_peripheral_obj_t *self = MP_OBJ_TO_PTR(self_in); + + common_hal_bleio_peripheral_stop_advertising(self); + + return mp_const_none; +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_peripheral_stop_advertising_obj, bleio_peripheral_stop_advertising); + +STATIC const mp_rom_map_elem_t bleio_peripheral_locals_dict_table[] = { + // Methods + { MP_ROM_QSTR(MP_QSTR_start_advertising), MP_ROM_PTR(&bleio_peripheral_start_advertising_obj) }, + { MP_ROM_QSTR(MP_QSTR_stop_advertising), MP_ROM_PTR(&bleio_peripheral_stop_advertising_obj) }, + + // Properties + { MP_ROM_QSTR(MP_QSTR_connected), MP_ROM_PTR(&bleio_peripheral_connected_obj) }, + { MP_ROM_QSTR(MP_QSTR_name), MP_ROM_PTR(&bleio_peripheral_name_obj) }, + { MP_ROM_QSTR(MP_QSTR_services), MP_ROM_PTR(&bleio_peripheral_services_obj) }, +}; + +STATIC MP_DEFINE_CONST_DICT(bleio_peripheral_locals_dict, bleio_peripheral_locals_dict_table); + +const mp_obj_type_t bleio_peripheral_type = { + { &mp_type_type }, + .name = MP_QSTR_Peripheral, + .make_new = bleio_peripheral_make_new, + .locals_dict = (mp_obj_dict_t*)&bleio_peripheral_locals_dict +}; diff --git a/ports/nrf/peripherals/nrf/nrf52832/power.c b/shared-bindings/bleio/Peripheral.h similarity index 60% rename from ports/nrf/peripherals/nrf/nrf52832/power.c rename to shared-bindings/bleio/Peripheral.h index 942524f530..02a5c1ef8e 100644 --- a/ports/nrf/peripherals/nrf/nrf52832/power.c +++ b/shared-bindings/bleio/Peripheral.h @@ -1,8 +1,9 @@ /* - * This file is part of the Micro Python project, http://micropython.org/ + * This file is part of the MicroPython project, http://micropython.org/ * * The MIT License (MIT) * + * Copyright (c) 2018 Artur Pacholec * Copyright (c) 2018 Dan Halbert for Adafruit Industries * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -24,7 +25,16 @@ * THE SOFTWARE. */ -#include "nrfx.h" +#ifndef MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_PERIPHERAL_H +#define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_PERIPHERAL_H -void nrf_peripherals_power_init(void) { -} +#include "common-hal/bleio/Peripheral.h" + +extern const mp_obj_type_t bleio_peripheral_type; + +extern void common_hal_bleio_peripheral_construct(bleio_peripheral_obj_t *self); +extern bool common_hal_bleio_peripheral_get_connected(bleio_peripheral_obj_t *self); +extern void common_hal_bleio_peripheral_start_advertising(bleio_peripheral_obj_t *device, bool connectable, mp_buffer_info_t *raw_data); +extern void common_hal_bleio_peripheral_stop_advertising(bleio_peripheral_obj_t *device); + +#endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_PERIPHERAL_H diff --git a/shared-bindings/bleio/Service.c b/shared-bindings/bleio/Service.c index 2d09cbc3c8..a0673bb2d0 100644 --- a/shared-bindings/bleio/Service.c +++ b/shared-bindings/bleio/Service.c @@ -27,6 +27,7 @@ #include "py/objproperty.h" #include "py/runtime.h" +#include "shared-bindings/bleio/Characteristic.h" #include "shared-bindings/bleio/Service.h" #include "shared-bindings/bleio/UUID.h" @@ -38,52 +39,31 @@ //| Stores information about a BLE service and its characteristics. //| -//| .. class:: Service(uuid, secondary=False) +//| .. class:: Service(uuid, characteristics, *, secondary=False) //| //| Create a new Service object identified by the specified UUID. //| To mark the service as secondary, pass `True` as :py:data:`secondary`. //| //| :param bleio.UUID uuid: The uuid of the service +//| :param iterable characteristics: the Characteristic objects for this service //| :param bool secondary: If the service is a secondary one //| -//| .. method:: add_characteristic(characteristic) -//| -//| Appends the :py:data:`characteristic` to the list of this service's characteristics. -//| -//| :param bleio.Characteristic characteristic: the characteristic to append -//| - -//| .. attribute:: characteristics -//| -//| A `list` of `bleio.Characteristic` that are offered by this service. (read-only) -//| - -//| .. attribute:: uuid -//| -//| The UUID of this service. (read-only) -//| -STATIC void bleio_service_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { - bleio_service_obj_t *self = MP_OBJ_TO_PTR(self_in); - - mp_printf(print, "Service(uuid: 0x"HEX2_FMT""HEX2_FMT")", - self->uuid->value[1], self->uuid->value[0]); -} - STATIC mp_obj_t bleio_service_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 1, 1, true); + mp_arg_check_num(n_args, n_kw, 2, 3, true); bleio_service_obj_t *self = m_new_obj(bleio_service_obj_t); - self->base.type = &bleio_service_type; - self->device = NULL; self->char_list = mp_obj_new_list(0, NULL); + self->base.type = &bleio_service_type; + self->device = mp_const_none; self->handle = 0xFFFF; mp_map_t kw_args; mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); - enum { ARG_uuid, ARG_secondary }; + enum { ARG_uuid, ARG_characteristics, ARG_secondary }; static const mp_arg_t allowed_args[] = { - { ARG_uuid, MP_ARG_OBJ, {.u_obj = mp_const_none} }, + { MP_QSTR_uuid, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = mp_const_none} }, + { MP_QSTR_characteristics, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = mp_const_none} }, { MP_QSTR_secondary, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} }, }; @@ -94,41 +74,46 @@ STATIC mp_obj_t bleio_service_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t uuid = args[ARG_uuid].u_obj; - if (uuid == mp_const_none) { - return MP_OBJ_FROM_PTR(self); + if (!MP_OBJ_IS_TYPE(uuid, &bleio_uuid_type)) { + mp_raise_ValueError(translate("Expected a UUID")); } - if (MP_OBJ_IS_TYPE(uuid, &bleio_uuid_type)) { - self->uuid = MP_OBJ_TO_PTR(uuid); - } else { - nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, - translate("Invalid UUID parameter"))); + self->uuid = MP_OBJ_TO_PTR(uuid); + + // If characteristics is not an iterable, an exception will be thrown. + mp_obj_iter_buf_t iter_buf; + mp_obj_t iterable = mp_getiter(args[ARG_characteristics].u_obj, &iter_buf); + mp_obj_t characteristic; + + while ((characteristic = mp_iternext(iterable)) != MP_OBJ_STOP_ITERATION) { + if (!MP_OBJ_IS_TYPE(characteristic, &bleio_characteristic_type)) { + mp_raise_ValueError(translate("characteristics includes an object that is not a Characteristic")); + } + bleio_characteristic_obj_t *characteristic_ptr = MP_OBJ_TO_PTR(characteristic); + if (common_hal_bleio_uuid_get_uuid128_reference(uuid) != + common_hal_bleio_uuid_get_uuid128_reference(characteristic_ptr->uuid)) { + // The descriptor base UUID doesn't match the characteristic base UUID. + mp_raise_ValueError(translate("Characteristic UUID doesn't match Service UUID")); + } + characteristic_ptr->service = self; + mp_obj_list_append(self->char_list, characteristic); } + // Do port-specific initialization. + common_hal_bleio_service_construct(self); + return MP_OBJ_FROM_PTR(self); } -STATIC mp_obj_t bleio_service_add_characteristic(mp_obj_t self_in, mp_obj_t characteristic_in) { - bleio_service_obj_t *self = MP_OBJ_TO_PTR(self_in); - bleio_characteristic_obj_t *characteristic = MP_OBJ_TO_PTR(characteristic_in); - - if (self->uuid->type == UUID_TYPE_128BIT) { - characteristic->uuid->type = UUID_TYPE_128BIT; - characteristic->uuid->uuid_vs_idx = self->uuid->uuid_vs_idx; - } - - characteristic->service = self; - - mp_obj_list_append(self->char_list, characteristic); - - return mp_const_none; -} -STATIC MP_DEFINE_CONST_FUN_OBJ_2(bleio_service_add_characteristic_obj, bleio_service_add_characteristic); - +//| .. attribute:: characteristics +//| +//| A `list` of `bleio.Characteristic` that are offered by this service. (read-only) +//| STATIC mp_obj_t bleio_service_get_characteristics(mp_obj_t self_in) { bleio_service_obj_t *self = MP_OBJ_TO_PTR(self_in); - - return self->char_list; + // Return list as a tuple so user won't be able to change it. + mp_obj_list_t *char_list = MP_OBJ_TO_PTR(self->char_list); + return mp_obj_new_tuple(char_list->len, char_list->items); } STATIC MP_DEFINE_CONST_FUN_OBJ_1(bleio_service_get_characteristics_obj, bleio_service_get_characteristics); @@ -139,6 +124,10 @@ const mp_obj_property_t bleio_service_characteristics_obj = { (mp_obj_t)&mp_const_none_obj }, }; +//| .. attribute:: uuid +//| +//| The UUID of this service. (read-only) +//| STATIC mp_obj_t bleio_service_get_uuid(mp_obj_t self_in) { bleio_service_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -154,7 +143,6 @@ const mp_obj_property_t bleio_service_uuid_obj = { }; STATIC const mp_rom_map_elem_t bleio_service_locals_dict_table[] = { - { MP_ROM_QSTR(MP_QSTR_add_characteristic), MP_ROM_PTR(&bleio_service_add_characteristic_obj) }, { MP_ROM_QSTR(MP_QSTR_characteristics), MP_ROM_PTR(&bleio_service_characteristics_obj) }, { MP_ROM_QSTR(MP_QSTR_uuid), MP_ROM_PTR(&bleio_service_uuid_obj) }, }; @@ -164,7 +152,6 @@ STATIC MP_DEFINE_CONST_DICT(bleio_service_locals_dict, bleio_service_locals_dict const mp_obj_type_t bleio_service_type = { { &mp_type_type }, .name = MP_QSTR_Service, - .print = bleio_service_print, .make_new = bleio_service_make_new, .locals_dict = (mp_obj_dict_t*)&bleio_service_locals_dict }; diff --git a/shared-bindings/bleio/Service.h b/shared-bindings/bleio/Service.h index 77c7518294..389db3b2e9 100644 --- a/shared-bindings/bleio/Service.h +++ b/shared-bindings/bleio/Service.h @@ -32,6 +32,7 @@ const mp_obj_type_t bleio_service_type; -extern void common_hal_bleio_service_add_characteristic(bleio_service_obj_t *self, bleio_characteristic_obj_t *characteristic); +extern void common_hal_bleio_service_construct(bleio_service_obj_t *self); +extern void common_hal_bleio_service_add_all_characteristics(bleio_service_obj_t *self); #endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_SERVICE_H diff --git a/shared-bindings/bleio/UUID.c b/shared-bindings/bleio/UUID.c index 7cef9a26fe..703bc1c654 100644 --- a/shared-bindings/bleio/UUID.c +++ b/shared-bindings/bleio/UUID.c @@ -5,6 +5,7 @@ * * Copyright (c) 2017 Glenn Ruben Bakke * Copyright (c) 2018 Artur Pacholec + * Copyright (c) 2018 Dan Halbert for Adafruit Industries * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -25,7 +26,10 @@ * THE SOFTWARE. */ +#include + #include "py/objproperty.h" +#include "py/objstr.h" #include "py/runtime.h" #include "shared-bindings/bleio/UUID.h" @@ -34,113 +38,173 @@ //| :class:`UUID` -- BLE UUID //| ========================================================= //| -//| Encapsulates both 16-bit and 128-bit UUIDs. Can be used for services, -//| characteristics, descriptors and more. +//| A 16-bit or 128-bit UUID. Can be used for services, characteristics, descriptors and more. //| -//| .. class:: UUID(uuid) +//| .. class:: UUID(value) //| -//| Create a new UUID object encapsulating the uuid value. -//| The value itself can be one of: +//| Create a new UUID or UUID object encapsulating the uuid value. +//| The value can be one of: //| -//| - a `int` value in range of 0 to 0xFFFF -//| - a `str` value in the format of '0xXXXX' for 16-bit or 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX' for 128-bit +//| - an `int` value in range 0 to 0xFFFF (Bluetooth SIG 16-bit UUID) +//| - a buffer object (bytearray, bytes) of 16 bytes in little-endian order (128-bit UUID) //| -//| :param int/str uuid: The uuid to encapsulate -//| - -//| .. method:: __len__() -//| -//| Returns the uuid length in bits -//| -//| This allows you to: -//| -//| uuid = bleio.UUID(0x1801) -//| print(len(uuid)) -//| - -//| .. attribute:: type -//| -//| The UUID type. One of: -//| -//| - `bleio.UUIDType.TYPE_16BIT` -//| - `bleio.UUIDType.TYPE_128BIT` +//| :param int/buffer value: The uuid value to encapsulate //| STATIC mp_obj_t bleio_uuid_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { - mp_arg_check_num(n_args, n_kw, 1, 1, true); + mp_arg_check_num(n_args, n_kw, 1, 1, false); + bleio_uuid_obj_t *self = m_new_obj(bleio_uuid_obj_t); - self->base.type = &bleio_uuid_type; + self->base.type = type; - mp_map_t kw_args; - mp_map_init_fixed_table(&kw_args, n_kw, pos_args + n_args); + const mp_obj_t value = pos_args[0]; + uint8_t uuid128[16]; - enum { ARG_uuid }; - static const mp_arg_t allowed_args[] = { - { ARG_uuid, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} }, - }; + if (MP_OBJ_IS_INT(value)) { + mp_int_t uuid16 = mp_obj_get_int(value); + if (uuid16 < 0 || uuid16 > 0xffff) { + mp_raise_ValueError(translate("UUID integer value not in range 0 to 0xffff")); + } - mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; - mp_arg_parse_all(n_args, pos_args, &kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + // NULL means no 128-bit value. + common_hal_bleio_uuid_construct(self, uuid16, NULL); - const mp_obj_t uuid = args[ARG_uuid].u_obj; + } else { + mp_buffer_info_t bufinfo; + if (!mp_get_buffer(value, &bufinfo, MP_BUFFER_READ)) { + mp_raise_ValueError(translate("UUID value is not int or byte buffer")); + } - common_hal_bleio_uuid_construct(self, &uuid); + if (bufinfo.len != 16) { + mp_raise_ValueError(translate("Byte buffer must be 16 bytes.")); + } + + memcpy(uuid128, bufinfo.buf, 16); + uint32_t uuid16 = (uuid128[13] << 8) | uuid128[12]; + uuid128[12] = 0; + uuid128[13] = 0; + common_hal_bleio_uuid_construct(self, uuid16, bufinfo.buf); + } return MP_OBJ_FROM_PTR(self); } -STATIC mp_obj_t bleio_uuid_unary_op(mp_unary_op_t op, mp_obj_t self_in) { +//| .. attribute:: uuid16 +//| +//| The 16-bit part of the UUID. (read-only) +//| +STATIC mp_obj_t bleio_uuid_get_uuid16(mp_obj_t self_in) { bleio_uuid_obj_t *self = MP_OBJ_TO_PTR(self_in); - - const bleio_uuid_type_t type = common_hal_bleio_uuid_get_type(self); - const uint8_t len = (type == UUID_TYPE_16BIT) ? 16 : 128; - switch (op) { - case MP_UNARY_OP_BOOL: return mp_obj_new_bool(len != 0); - case MP_UNARY_OP_LEN: return MP_OBJ_NEW_SMALL_INT(len); - default: return MP_OBJ_NULL; // op not supported - } + return MP_OBJ_NEW_SMALL_INT(common_hal_bleio_uuid_get_uuid16(self)); } -STATIC void bleio_uuid_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { - bleio_uuid_obj_t *self = MP_OBJ_TO_PTR(self_in); +MP_DEFINE_CONST_FUN_OBJ_1(bleio_uuid_get_uuid16_obj, bleio_uuid_get_uuid16); - common_hal_bleio_uuid_print(self, print); -} - -STATIC mp_obj_t bleio_uuid_get_type(mp_obj_t self_in) { - bleio_uuid_obj_t *self = MP_OBJ_TO_PTR(self_in); - - const bleio_uuid_type_t type = common_hal_bleio_uuid_get_type(self); - if (type == UUID_TYPE_16BIT) { - return (mp_obj_t)&bleio_uuidtype_16bit_obj; - } - - if (type == UUID_TYPE_128BIT) { - return (mp_obj_t)&bleio_uuidtype_128bit_obj; - } - - return (mp_obj_t)&mp_const_none_obj; -} -MP_DEFINE_CONST_FUN_OBJ_1(bleio_uuid_get_type_obj, bleio_uuid_get_type); - -const mp_obj_property_t bleio_uuid_type_obj = { +const mp_obj_property_t bleio_uuid_uuid16_obj = { .base.type = &mp_type_property, - .proxy = {(mp_obj_t)&bleio_uuid_get_type_obj, + .proxy = {(mp_obj_t)&bleio_uuid_get_uuid16_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +//| .. attribute:: uuid128 +//| +//| The 128-bit value of the UUID, returned as bytes. +//| Raises AttributeError if this is a 16-bit UUID. (read-only) +//| +STATIC mp_obj_t bleio_uuid_get_uuid128(mp_obj_t self_in) { + bleio_uuid_obj_t *self = MP_OBJ_TO_PTR(self_in); + + uint8_t uuid128[16]; + if (!common_hal_bleio_uuid_get_uuid128(self, uuid128)) { + mp_raise_AttributeError(translate("not a 128-bit UUID")); + } + return mp_obj_new_bytes(uuid128, 16); +} + +MP_DEFINE_CONST_FUN_OBJ_1(bleio_uuid_get_uuid128_obj, bleio_uuid_get_uuid128); + +const mp_obj_property_t bleio_uuid_uuid128_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&bleio_uuid_get_uuid128_obj, + (mp_obj_t)&mp_const_none_obj, + (mp_obj_t)&mp_const_none_obj}, +}; + +//| .. attribute:: size +//| +//| Returns 128 if this UUID represents a 128-bit vendor-specific UUID. +//| Returns 16 if this UUID represents a 16-bit Bluetooth SIG assigned UUID. (read-only) +//| 32-bit UUIDs are not currently supported. +//| +STATIC mp_obj_t bleio_uuid_get_size(mp_obj_t self_in) { + bleio_uuid_obj_t *self = MP_OBJ_TO_PTR(self_in); + return MP_OBJ_NEW_SMALL_INT(common_hal_bleio_uuid_get_size(self)); +} + +MP_DEFINE_CONST_FUN_OBJ_1(bleio_uuid_get_size_obj, bleio_uuid_get_size); + +const mp_obj_property_t bleio_uuid_size_obj = { + .base.type = &mp_type_property, + .proxy = {(mp_obj_t)&bleio_uuid_get_size_obj, (mp_obj_t)&mp_const_none_obj, (mp_obj_t)&mp_const_none_obj}, }; STATIC const mp_rom_map_elem_t bleio_uuid_locals_dict_table[] = { - { MP_ROM_QSTR(MP_QSTR_type), MP_ROM_PTR(&bleio_uuid_type_obj) }, + { MP_ROM_QSTR(MP_QSTR_uuid16), MP_ROM_PTR(&bleio_uuid_uuid16_obj) }, + { MP_ROM_QSTR(MP_QSTR_uuid128), MP_ROM_PTR(&bleio_uuid_uuid128_obj) }, + { MP_ROM_QSTR(MP_QSTR_size), MP_ROM_PTR(&bleio_uuid_size_obj) }, }; STATIC MP_DEFINE_CONST_DICT(bleio_uuid_locals_dict, bleio_uuid_locals_dict_table); +STATIC mp_obj_t bleio_uuid_unary_op(mp_unary_op_t op, mp_obj_t self_in) { + bleio_uuid_obj_t *self = MP_OBJ_TO_PTR(self_in); + switch (op) { + case MP_UNARY_OP_HASH: + if (common_hal_bleio_uuid_get_size(self) == 16) { + return MP_OBJ_NEW_SMALL_INT(common_hal_bleio_uuid_get_uuid16(self)); + } else { + union { + uint8_t uuid128_bytes[16]; + uint16_t uuid128_uint16[8]; + } uuid128; + common_hal_bleio_uuid_get_uuid128(self, uuid128.uuid128_bytes); + int hash = 0; + for (size_t i = 0; i < MP_ARRAY_SIZE(uuid128.uuid128_uint16); i++) { + hash += uuid128.uuid128_uint16[i]; + } + return MP_OBJ_NEW_SMALL_INT(hash); + } + default: + return MP_OBJ_NULL; // op not supported + } +} + +STATIC mp_obj_t bleio_uuid_binary_op(mp_binary_op_t op, mp_obj_t lhs_in, mp_obj_t rhs_in) { + switch (op) { + // Two UUID's are equal if their uuid16 values and uuid128 references match. + case MP_BINARY_OP_EQUAL: + if (MP_OBJ_IS_TYPE(rhs_in, &bleio_uuid_type)) { + return mp_obj_new_bool( + common_hal_bleio_uuid_get_uuid16(lhs_in) == common_hal_bleio_uuid_get_uuid16(rhs_in) && + common_hal_bleio_uuid_get_uuid128_reference(lhs_in) == + common_hal_bleio_uuid_get_uuid128_reference(rhs_in)); + } else { + return mp_const_false; + } + + default: + return MP_OBJ_NULL; // op not supported + } +} + const mp_obj_type_t bleio_uuid_type = { { &mp_type_type }, .name = MP_QSTR_UUID, - .print = bleio_uuid_print, .make_new = bleio_uuid_make_new, .unary_op = bleio_uuid_unary_op, - .locals_dict = (mp_obj_dict_t*)&bleio_uuid_locals_dict + .binary_op = bleio_uuid_binary_op, + .locals_dict = (mp_obj_dict_t*)&bleio_uuid_locals_dict, }; diff --git a/shared-bindings/bleio/UUID.h b/shared-bindings/bleio/UUID.h index d6fcbac1b4..aef2c1e29e 100644 --- a/shared-bindings/bleio/UUID.h +++ b/shared-bindings/bleio/UUID.h @@ -28,12 +28,15 @@ #define MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_UUID_H #include "common-hal/bleio/UUID.h" -#include "shared-bindings/bleio/UUIDType.h" + +void bleio_uuid_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind); extern const mp_obj_type_t bleio_uuid_type; -extern void common_hal_bleio_uuid_construct(bleio_uuid_obj_t *self, const mp_obj_t *uuid); -extern void common_hal_bleio_uuid_print(bleio_uuid_obj_t *self, const mp_print_t *print); -extern bleio_uuid_type_t common_hal_bleio_uuid_get_type(bleio_uuid_obj_t *self); +extern void common_hal_bleio_uuid_construct(bleio_uuid_obj_t *self, mp_int_t uuid16, uint8_t uuid128[]); +extern uint32_t common_hal_bleio_uuid_get_uuid16(bleio_uuid_obj_t *self); +extern bool common_hal_bleio_uuid_get_uuid128(bleio_uuid_obj_t *self, uint8_t uuid128[16]); +extern uint32_t common_hal_bleio_uuid_get_uuid128_reference(bleio_uuid_obj_t *self); +extern uint32_t common_hal_bleio_uuid_get_size(bleio_uuid_obj_t *self); #endif // MICROPY_INCLUDED_SHARED_BINDINGS_BLEIO_UUID_H diff --git a/shared-bindings/bleio/UUIDType.c b/shared-bindings/bleio/UUIDType.c deleted file mode 100644 index e36d1f06d2..0000000000 --- a/shared-bindings/bleio/UUIDType.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This file is part of the Micro Python project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018 Artur Pacholec - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#include "shared-bindings/bleio/UUIDType.h" - -//| .. currentmodule:: bleio -//| -//| :class:`UUIDType` -- defines the type of a BLE UUID -//| ============================================================= -//| -//| .. class:: bleio.UUIDType -//| -//| Enum-like class to define the type of a BLE UUID. -//| -//| .. data:: TYPE_16BIT -//| -//| The UUID is 16-bit -//| -//| .. data:: TYPE_128BIT -//| -//| The UUID is 128-bit -//| -const mp_obj_type_t bleio_uuidtype_type; - -const bleio_uuidtype_obj_t bleio_uuidtype_16bit_obj = { - { &bleio_uuidtype_type }, -}; - -const bleio_uuidtype_obj_t bleio_uuidtype_128bit_obj = { - { &bleio_uuidtype_type }, -}; - -STATIC const mp_rom_map_elem_t bleio_uuidtype_locals_dict_table[] = { - { MP_ROM_QSTR(MP_QSTR_TYPE_16BIT), MP_ROM_PTR(&bleio_uuidtype_16bit_obj) }, - { MP_ROM_QSTR(MP_QSTR_TYPE_128BIT), MP_ROM_PTR(&bleio_uuidtype_128bit_obj) }, -}; -STATIC MP_DEFINE_CONST_DICT(bleio_uuidtype_locals_dict, bleio_uuidtype_locals_dict_table); - -STATIC void bleio_uuidtype_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { - qstr type = MP_QSTR_TYPE_128BIT; - if (MP_OBJ_TO_PTR(self_in) == MP_ROM_PTR(&bleio_uuidtype_16bit_obj)) { - type = MP_QSTR_TYPE_16BIT; - } - mp_printf(print, "%q.%q.%q", MP_QSTR_bleio, MP_QSTR_UUIDType, type); -} - -const mp_obj_type_t bleio_uuidtype_type = { - { &mp_type_type }, - .name = MP_QSTR_UUIDType, - .print = bleio_uuidtype_print, - .locals_dict = (mp_obj_t)&bleio_uuidtype_locals_dict, -}; diff --git a/shared-bindings/bleio/__init__.c b/shared-bindings/bleio/__init__.c index 98099422c9..42bd093f19 100644 --- a/shared-bindings/bleio/__init__.c +++ b/shared-bindings/bleio/__init__.c @@ -29,14 +29,15 @@ #include "shared-bindings/bleio/Address.h" #include "shared-bindings/bleio/AddressType.h" #include "shared-bindings/bleio/AdvertisementData.h" +#include "shared-bindings/bleio/Broadcaster.h" #include "shared-bindings/bleio/Characteristic.h" +#include "shared-bindings/bleio/CharacteristicBuffer.h" #include "shared-bindings/bleio/Descriptor.h" -#include "shared-bindings/bleio/Device.h" +#include "shared-bindings/bleio/Peripheral.h" #include "shared-bindings/bleio/ScanEntry.h" #include "shared-bindings/bleio/Scanner.h" #include "shared-bindings/bleio/Service.h" #include "shared-bindings/bleio/UUID.h" -#include "shared-bindings/bleio/UUIDType.h" //| :mod:`bleio` --- Bluetooth Low Energy functionality //| ================================================================ @@ -56,14 +57,16 @@ //| AddressType //| AdvertisementData //| Adapter +//| Broadcaster //| Characteristic +//| CharacteristicBuffer //| Descriptor //| Device +//| Peripheral //| ScanEntry //| Scanner //| Service //| UUID -//| UUIDType //| //| .. attribute:: adapter //| @@ -76,9 +79,11 @@ STATIC const mp_rom_map_elem_t bleio_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_bleio) }, { MP_ROM_QSTR(MP_QSTR_Address), MP_ROM_PTR(&bleio_address_type) }, { MP_ROM_QSTR(MP_QSTR_AdvertisementData), MP_ROM_PTR(&bleio_advertisementdata_type) }, + { MP_ROM_QSTR(MP_QSTR_Broadcaster), MP_ROM_PTR(&bleio_broadcaster_type) }, { MP_ROM_QSTR(MP_QSTR_Characteristic), MP_ROM_PTR(&bleio_characteristic_type) }, + { MP_ROM_QSTR(MP_QSTR_CharacteristicBuffer), MP_ROM_PTR(&bleio_characteristic_buffer_type) }, { MP_ROM_QSTR(MP_QSTR_Descriptor), MP_ROM_PTR(&bleio_descriptor_type) }, - { MP_ROM_QSTR(MP_QSTR_Device), MP_ROM_PTR(&bleio_device_type) }, + { MP_ROM_QSTR(MP_QSTR_Peripheral), MP_ROM_PTR(&bleio_peripheral_type) }, { MP_ROM_QSTR(MP_QSTR_ScanEntry), MP_ROM_PTR(&bleio_scanentry_type) }, { MP_ROM_QSTR(MP_QSTR_Scanner), MP_ROM_PTR(&bleio_scanner_type) }, { MP_ROM_QSTR(MP_QSTR_Service), MP_ROM_PTR(&bleio_service_type) }, @@ -89,7 +94,6 @@ STATIC const mp_rom_map_elem_t bleio_module_globals_table[] = { // Enum-like Classes. { MP_ROM_QSTR(MP_QSTR_AddressType), MP_ROM_PTR(&bleio_addresstype_type) }, - { MP_ROM_QSTR(MP_QSTR_UUIDType), MP_ROM_PTR(&bleio_uuidtype_type) }, }; STATIC MP_DEFINE_CONST_DICT(bleio_module_globals, bleio_module_globals_table); diff --git a/shared-bindings/busio/SPI.c b/shared-bindings/busio/SPI.c index d30bbbe063..646d50aed0 100644 --- a/shared-bindings/busio/SPI.c +++ b/shared-bindings/busio/SPI.c @@ -150,8 +150,8 @@ static void check_lock(busio_spi_obj_t *self) { //| speed is not guaranteed to work. 12 MHz is the next available lower speed, and is //| within spec for the SAMD21. //| -//| .. note:: On the nRF52832, these baudrates are available: 125kHz, 250kHz, 1MHz, 2MHz, 4MHz, -//| and 8MHz. On the nRF52840, 16MHz and 32MHz are also available, but only on the first +//| .. note:: On the nRF52840, these baudrates are available: 125kHz, 250kHz, 1MHz, 2MHz, 4MHz, +//| and 8MHz. 16MHz and 32MHz are also available, but only on the first //| `busio.SPI` object you create. Two more ``busio.SPI`` objects can be created, but they are restricted //| to 8MHz maximum. This is a hardware restriction: there is only one high-speed SPI peripheral. //| If you pick a a baudrate other than one of these, the nearest lower diff --git a/shared-bindings/supervisor/Runtime.c b/shared-bindings/supervisor/Runtime.c index 5ba2198e1f..746dfe5ee7 100755 --- a/shared-bindings/supervisor/Runtime.c +++ b/shared-bindings/supervisor/Runtime.c @@ -59,9 +59,6 @@ //| has been established at any point. Will not reset if //| USB is disconnected but power remains (e.g. battery connected) //| -//| Feather52 (nRF52832): Currently returns ``True`` regardless -//| of USB connection status. -//| STATIC mp_obj_t supervisor_get_serial_connected(mp_obj_t self){ if (!common_hal_get_serial_connected()) { diff --git a/shared-bindings/usb_midi/PortIn.c b/shared-bindings/usb_midi/PortIn.c index 3c4d4f73f6..e1e6eabccf 100644 --- a/shared-bindings/usb_midi/PortIn.c +++ b/shared-bindings/usb_midi/PortIn.c @@ -46,7 +46,7 @@ //| Not currently dynamically supported. //| //| PortIn objects are constructed for every corresponding entry in the USB descriptor and added -//| to the `usb_midi.ports` tuple. +//| to the ``usb_midi.ports`` tuple. //| STATIC mp_obj_t usb_midi_portin_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { diff --git a/shared-bindings/usb_midi/PortOut.c b/shared-bindings/usb_midi/PortOut.c index 8b26b8ffc4..0588eed90a 100644 --- a/shared-bindings/usb_midi/PortOut.c +++ b/shared-bindings/usb_midi/PortOut.c @@ -46,7 +46,7 @@ //| Not currently dynamically supported. //| //| PortOut objects are constructed for every corresponding entry in the USB descriptor and added -//| to the `usb_midi.ports` tuple. +//| to the ``usb_midi.ports`` tuple. //| STATIC mp_obj_t usb_midi_portout_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *pos_args) { diff --git a/shared-module/bleio/Characteristic.h b/shared-module/bleio/Characteristic.h index 94c43f81e0..958837e64f 100644 --- a/shared-module/bleio/Characteristic.h +++ b/shared-module/bleio/Characteristic.h @@ -27,26 +27,15 @@ #ifndef MICROPY_INCLUDED_SHARED_MODULE_BLEIO_CHARACTERISTIC_H #define MICROPY_INCLUDED_SHARED_MODULE_BLEIO_CHARACTERISTIC_H -#include "shared-module/bleio/Service.h" -#include "common-hal/bleio/UUID.h" - +// Flags for each characteristic property. Common across ports. typedef struct { - mp_obj_base_t base; - bleio_service_obj_t *service; - bleio_uuid_obj_t *uuid; - mp_obj_t value_data; - uint16_t handle; - struct { bool broadcast : 1; bool read : 1; - bool write_wo_resp : 1; + bool write_no_response : 1; bool write : 1; bool notify : 1; bool indicate : 1; - } props; - uint16_t user_desc_handle; - uint16_t cccd_handle; - uint16_t sccd_handle; -} bleio_characteristic_obj_t; +} bleio_characteristic_properties_t; + #endif // MICROPY_INCLUDED_SHARED_MODULE_BLEIO_CHARACTERISTIC_H diff --git a/shared-module/bleio/Service.h b/shared-module/bleio/Service.h index ff506d3f3b..828d4cdc87 100644 --- a/shared-module/bleio/Service.h +++ b/shared-module/bleio/Service.h @@ -28,14 +28,14 @@ #define MICROPY_INCLUDED_SHARED_MODULE_BLEIO_SERVICE_H #include "common-hal/bleio/UUID.h" -#include "shared-module/bleio/Device.h" typedef struct { mp_obj_base_t base; uint16_t handle; bool is_secondary; bleio_uuid_obj_t *uuid; - bleio_device_obj_t *device; + // May be a Peripheral, Central, etc. + mp_obj_t *device; mp_obj_t char_list; uint16_t start_handle; uint16_t end_handle; diff --git a/ports/nrf/boards/pca10040/board.c b/shared-module/bleio/__init__.h similarity index 77% rename from ports/nrf/boards/pca10040/board.c rename to shared-module/bleio/__init__.h index f1a49a74a7..07d1485946 100644 --- a/ports/nrf/boards/pca10040/board.c +++ b/shared-module/bleio/__init__.h @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (c) 2017 Scott Shawcroft for Adafruit Industries + * Copyright (c) 2018 Dan Halbert for Adafruit Industries * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,20 +24,15 @@ * THE SOFTWARE. */ -#include -#include +#ifndef MICROPY_INCLUDED_SHARED_MODULE_BLEIO_INIT_H +#define MICROPY_INCLUDED_SHARED_MODULE_BLEIO_INIT_H -#include "nrf.h" +typedef enum { + GATT_ROLE_NONE, + GATT_ROLE_SERVER, + GATT_ROLE_CLIENT, +} gatt_role_t; -#include "boards/board.h" +extern void bleio_reset(void); -void board_init(void) { -} - -bool board_requests_safe_mode(void) { - return false; -} - -void reset_board(void) { - -} +#endif // MICROPY_INCLUDED_SHARED_MODULE_BLEIO_INIT_H diff --git a/tools/build_board_info.py b/tools/build_board_info.py index 379cf55c4d..a4b49d1608 100644 --- a/tools/build_board_info.py +++ b/tools/build_board_info.py @@ -36,10 +36,6 @@ extension_by_board = { "feather_m0_rfm69": BIN, "feather_m0_rfm9x": BIN, - # nrf52832 - "feather_nrf52832": BIN, - "pca10040": BIN, - # nRF52840 dev kits that may not have UF2 bootloaders, "makerdiary_nrf52840_mdk": HEX, "pca10056": BIN_UF2,